enhance activity logging to support including deny and reject events; fix some activity logging issues;

pull/1/head
Bryan Biedenkapp 5 years ago
parent 7184a6923f
commit 3c8d747538

@ -115,7 +115,14 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
// validate source RID // validate source RID
if (!acl::AccessControl::validateSrcId(srcId)) { 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; delete lc;
return false; return false;
} }
@ -123,12 +130,21 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
// validate target TID, if the target is a talkgroup // validate target TID, if the target is a talkgroup
if (flco == FLCO_GROUP) { if (flco == FLCO_GROUP) {
if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { 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; delete lc;
return false; return false;
} }
} }
m_lastRejectId = 0U;
if (m_verbose) { 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()); 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); 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; return true;
} }
else if (dataType == DT_VOICE_PI_HEADER) { 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) { 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_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); m_slot->m_minRSSI, m_slot->m_maxRSSI, m_slot->m_aveRSSI / m_slot->m_rssiCount);
} }
else { 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)); 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); 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; break;
case CSBKO_ACK_RSP: case CSBKO_ACK_RSP:
if (m_verbose) { if (m_verbose) {
@ -369,7 +385,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId); 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; break;
case CSBKO_EXT_FNCT: case CSBKO_EXT_FNCT:
if (m_verbose) { if (m_verbose) {
@ -379,22 +395,22 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
// generate activity log entry // generate activity log entry
if (csbk.getCBF() == DMR_EXT_FNCT_CHECK) { 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) { 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) { 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) { 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) { 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) { 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; break;
case CSBKO_PRECCSBK: 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); 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); ::memset(m_pduUserData, 0x00U, DMR_MAX_PDU_COUNT * DMR_MAX_PDU_LENGTH + 2U);
m_pduDataOffset = 0U; m_pduDataOffset = 0U;
if (m_slot->m_rfFrames == 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(); 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); 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) { else if (dataType == DT_VOICE_PI_HEADER) {
if (m_slot->m_netState != RS_NET_AUDIO) { 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); 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); 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? // We've received the voice header and terminator haven't we?
m_slot->m_netFrames += 2U; 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)); 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(); writeEndNet();
@ -878,7 +894,7 @@ void DataPacket::processNetwork(const data::Data& dmrData)
m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId); 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; break;
case CSBKO_ACK_RSP: case CSBKO_ACK_RSP:
if (m_verbose) { if (m_verbose) {
@ -886,7 +902,7 @@ void DataPacket::processNetwork(const data::Data& dmrData)
m_slot->m_slotNo, srcId, gi ? "TG " : "", dstId); 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; break;
case CSBKO_EXT_FNCT: case CSBKO_EXT_FNCT:
if (m_verbose) { if (m_verbose) {
@ -896,22 +912,22 @@ void DataPacket::processNetwork(const data::Data& dmrData)
// generate activity log entry // generate activity log entry
if (csbk.getCBF() == DMR_EXT_FNCT_CHECK) { 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) { 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) { 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) { 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) { 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) { 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; break;
case CSBKO_PRECCSBK: 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); 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); 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); ::memset(m_pduUserData, 0x00U, DMR_MAX_PDU_COUNT * DMR_MAX_PDU_LENGTH + 2U);
m_pduDataOffset = 0U; m_pduDataOffset = 0U;
if (m_slot->m_netFrames == 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(); writeEndNet();
} }
} }
@ -1082,6 +1098,7 @@ DataPacket::DataPacket(Slot* slot, network::BaseNetwork* network, bool dumpDataP
m_netLC(NULL), m_netLC(NULL),
m_pduUserData(NULL), m_pduUserData(NULL),
m_pduDataOffset(0U), m_pduDataOffset(0U),
m_lastRejectId(0U),
m_dumpDataPacket(dumpDataPacket), m_dumpDataPacket(dumpDataPacket),
m_repeatDataPacket(repeatDataPacket), m_repeatDataPacket(repeatDataPacket),
m_dumpCSBKData(dumpCSBKData), m_dumpCSBKData(dumpCSBKData),

@ -77,6 +77,7 @@ namespace dmr
uint8_t* m_pduUserData; uint8_t* m_pduUserData;
uint32_t m_pduDataOffset; uint32_t m_pduDataOffset;
uint32_t m_lastRejectId;
bool m_dumpDataPacket; bool m_dumpDataPacket;
bool m_repeatDataPacket; bool m_repeatDataPacket;

@ -152,11 +152,11 @@ bool Slot::processFrame(uint8_t *data, uint32_t len)
if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) { if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) {
if (m_rssi != 0U) { 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); m_slotNo, float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
} }
else { 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)); 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) { if (m_netState == RS_NET_AUDIO) {
// We've received the voice header haven't we? // We've received the voice header haven't we?
m_netFrames += 1U; 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_slotNo, float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
m_data->writeEndNet(true); m_data->writeEndNet(true);
} }
else { 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(); 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 // generate activity log entry
if (func == DMR_EXT_FNCT_CHECK) { 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) { 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) { 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]; 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); 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]; uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U];
::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES); ::memset(data + 2U, 0x00U, DMR_FRAME_LENGTH_BYTES);

@ -395,7 +395,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
m_slot->setShortLC(m_slot->m_slotNo, dstId, flco, true); 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; 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); 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); m_slot->m_slotNo, srcId, m_slot->m_data->m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dstId);
} }

@ -1009,7 +1009,6 @@ int Host::run()
Thread::sleep(1U); Thread::sleep(1U);
} }
::ActivityLog("DVM", true, "Host is down and stopping");
setMode(HOST_STATE_QUIT); setMode(HOST_STATE_QUIT);
delete dmr; delete dmr;

@ -787,20 +787,6 @@ void Control::writeRF_TDU(bool noNetwork)
} }
} }
/// <summary>
///
/// </summary>
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");
}
}
/// <summary> /// <summary>
/// Helper to set the busy status bits on P25 frame data. /// Helper to set the busy status bits on P25 frame data.
/// </summary> /// </summary>

@ -184,9 +184,6 @@ namespace p25
/// <summary>Helper to write a P25 TDU packet.</summary> /// <summary>Helper to write a P25 TDU packet.</summary>
void writeRF_TDU(bool noNetwork); void writeRF_TDU(bool noNetwork);
/// <summary></summary>
void checkAndReject();
/// <summary>Helper to set the busy status bits on P25 frame data.</summary> /// <summary>Helper to set the busy status bits on P25 frame data.</summary>
void setBusyBits(uint8_t* data, uint32_t ssOffset, bool b1, bool b2); void setBusyBits(uint8_t* data, uint32_t ssOffset, bool b1, bool b2);
/// <summary>Helper to add the busy status bits on P25 frame data.</summary> /// <summary>Helper to add the busy status bits on P25 frame data.</summary>

@ -317,7 +317,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len)
} }
break; break;
default: 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_repeatPDU) {
if (m_verbose) { 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 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; break;
} }
@ -379,6 +379,7 @@ bool DataPacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, da
} }
else if (dataType == P25_DT_DATA) { else if (dataType == P25_DT_DATA) {
writeNet_PDU(); 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) { 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); 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_netDataHeader.reset();
m_netSecondHeader.reset(); m_netSecondHeader.reset();
@ -808,8 +809,6 @@ void DataPacket::writeNet_PDU_Header()
return; 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) { 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", 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(), m_netDataHeader.getAckNeeded(), m_netDataHeader.getOutbound(), m_netDataHeader.getFormat(), m_netDataHeader.getSAP(), m_netDataHeader.getFullMessage(),

@ -52,7 +52,7 @@ using namespace p25;
if (!m_p25->m_control) { \ if (!m_p25->m_control) { \
LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, unsupported service, srcId = %u", _SRCID); \ LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, unsupported service, srcId = %u", _SRCID); \
writeRF_TSDU_Deny(P25_DENY_RSN_SYS_UNSUPPORTED_SVC, _PCKT); \ writeRF_TSDU_Deny(P25_DENY_RSN_SYS_UNSUPPORTED_SVC, _PCKT); \
m_p25->checkAndReject(); \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ return false; \
} }
@ -62,7 +62,7 @@ using namespace p25;
LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, RID rejection, srcId = %u", _SRCID); \ 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); \ writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_VALID, _PCKT); \
denialInhibit(_SRCID); \ denialInhibit(_SRCID); \
m_p25->checkAndReject(); \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ return false; \
} }
@ -71,7 +71,7 @@ using namespace p25;
if (!acl::AccessControl::validateSrcId(_DSTID)) { \ if (!acl::AccessControl::validateSrcId(_DSTID)) { \
LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, RID rejection, dstId = %u", _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); \ writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_NOT_VALID, _PCKT); \
m_p25->checkAndReject(); \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ return false; \
} }
@ -80,7 +80,7 @@ using namespace p25;
if (!acl::AccessControl::validateTGId(_DSTID)) { \ if (!acl::AccessControl::validateTGId(_DSTID)) { \
LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, TGID rejection, dstId = %u", _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); \ writeRF_TSDU_Deny(P25_DENY_RSN_TGT_GROUP_NOT_VALID, _PCKT); \
m_p25->checkAndReject(); \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ return false; \
} }
@ -90,7 +90,7 @@ using namespace p25;
LogWarning(LOG_RF, P25_TSDU_STR ", " _PCKT_STR " denial, RID not registered, srcId = %u", _SRCID); \ 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_Deny(P25_DENY_RSN_REQ_UNIT_NOT_AUTH, _PCKT); \
writeRF_TSDU_U_Reg_Cmd(_SRCID); \ writeRF_TSDU_U_Reg_Cmd(_SRCID); \
m_p25->checkAndReject(); \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ 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); \ 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_Deny(P25_DENY_RSN_REQ_UNIT_NOT_AUTH, _PCKT); \
writeRF_TSDU_U_Reg_Cmd(_SRCID); \ writeRF_TSDU_U_Reg_Cmd(_SRCID); \
m_p25->checkAndReject(); \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ 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); 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); writeRF_TSDU_Grant(true, false);
break; break;
case TSBK_IOSP_UU_VCH: 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); 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); writeRF_TSDU_UU_Ans_Req(srcId, dstId);
break; break;
case TSBK_IOSP_UU_ANS: 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); 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) { if (!m_noStatusAck) {
writeRF_TSDU_ACK_FNE(srcId, TSBK_IOSP_STS_UPDT, false, false); 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); 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; break;
case TSBK_IOSP_CALL_ALRT: case TSBK_IOSP_CALL_ALRT:
// validate the source RID // 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); 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); writeRF_TSDU_Call_Alrt(srcId, dstId);
break; break;
@ -494,7 +490,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
m_rfTSBK.getAIV(), m_rfTSBK.getService(), srcId, dstId); 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 // 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 // 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); 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); writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_CAN_SRV_REQ, false, true);
break; break;
@ -536,13 +532,13 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
// generate activity log entry // generate activity log entry
if (m_rfTSBK.getExtendedFunction() == P25_EXT_FNCT_CHECK_ACK) { 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) { 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) { 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); writeRF_TSDU_SBF(true);
@ -570,7 +566,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
m_rfTSBK.getPatchSuperGroupId()); 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; break;
case TSBK_ISP_U_DEREG_REQ: case TSBK_ISP_U_DEREG_REQ:
// make sure control data is supported // 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); m_netTSBK.getStatus(), srcId);
} }
::ActivityLog("P25", false, "received status update from %u", srcId); ::ActivityLog("P25", false, "status update from %u", srcId);
break; break;
case TSBK_IOSP_MSG_UPDT: case TSBK_IOSP_MSG_UPDT:
// validate the source RID // 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); m_netTSBK.getMessage(), srcId, dstId);
} }
::ActivityLog("P25", false, "received message update from %u", srcId); ::ActivityLog("P25", false, "message update from %u", srcId);
break; break;
case TSBK_IOSP_CALL_ALRT: case TSBK_IOSP_CALL_ALRT:
// validate the source RID // 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); 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; break;
case TSBK_IOSP_ACK_RSP: case TSBK_IOSP_ACK_RSP:
// validate the source RID // 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); 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; break;
case TSBK_IOSP_EXT_FNCT: case TSBK_IOSP_EXT_FNCT:
// validate the target RID // 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); 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.setLCO(TSBK_IOSP_CALL_ALRT);
m_rfTSBK.setSrcId(srcId); 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 // generate activity log entry
if (func == P25_EXT_FNCT_CHECK) { 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) { 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) { 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); 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); 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.setLCO(TSBK_OSP_GRP_AFF_Q);
m_rfTSBK.setSrcId(P25_WUID_SYS); 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); 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.setLCO(TSBK_OSP_U_REG_CMD);
m_rfTSBK.setSrcId(P25_WUID_SYS); 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) { 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()); 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); 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); m_rfTSBK.setLCO(lco);
return false; 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) { 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()); 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); 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); m_rfTSBK.setLCO(lco);
return false; 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 != 0U) {
if (m_p25->m_rfLastDstId != m_rfTSBK.getDstId() && (m_p25->m_rfTGHang.isRunning() && !m_p25->m_rfTGHang.hasExpired())) { 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); 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); m_rfTSBK.setLCO(lco);
return false; return false;
} }
@ -1974,14 +1976,20 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip)
if (grp) { 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()); 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); 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); m_rfTSBK.setLCO(lco);
return false; return false;
} }
else { 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()); 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); 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); m_rfTSBK.setLCO(lco);
return false; return false;
} }
@ -2010,6 +2018,8 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip)
} }
if (grp) { if (grp) {
::ActivityLog("P25", true, "group grant request from %u to TG %u", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId());
if (m_verbose) { 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", 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()); 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); writeRF_TSDU_SBF(true, true);
} }
else { else {
::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId());
if (m_verbose) { 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", 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()); 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 // validate the source RID
if (!acl::AccessControl::validateSrcId(srcId)) { if (!acl::AccessControl::validateSrcId(srcId)) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_AFF (Group Affiliation Response) denial, RID rejection, srcId = %u", 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 // validate the source RID is registered
if (!hasSrcIdUnitReg(srcId) && m_verifyReg) { 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); 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 // validate the talkgroup ID
if (m_rfTSBK.getGroup()) { if (m_rfTSBK.getGroup()) {
if (!acl::AccessControl::validateTGId(dstId)) { if (!acl::AccessControl::validateTGId(dstId)) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_AFF (Group Affiliation Response) denial, TGID rejection, dstId = %u", 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); 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; ret = true;
// update dynamic affiliation table // update dynamic affiliation table
@ -2172,13 +2187,15 @@ void TrunkPacket::writeRF_TSDU_U_Reg_Rsp(uint32_t srcId)
// validate the system ID // validate the system ID
if (m_rfTSBK.getSysId() != m_siteData.sysId()) { 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()); 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); m_rfTSBK.setResponse(P25_RSP_DENY);
} }
// validate the source RID // validate the source RID
if (!acl::AccessControl::validateSrcId(srcId)) { if (!acl::AccessControl::validateSrcId(srcId)) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_U_REG (Unit Registration Response) denial, RID rejection, srcId = %u", 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) { 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()); 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 // update dynamic unit registration table
if (!hasSrcIdUnitReg(srcId)) { if (!hasSrcIdUnitReg(srcId)) {
@ -2219,7 +2236,7 @@ void TrunkPacket::writeRF_TSDU_U_Dereg_Ack(uint32_t srcId)
srcId, m_rfTSBK.getSysId(), m_rfTSBK.getNetId()); 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 // remove dynamic unit registration table entry
if (std::find(m_unitRegTable.begin(), m_unitRegTable.end(), srcId) != m_unitRegTable.end()) { if (std::find(m_unitRegTable.begin(), m_unitRegTable.end(), srcId) != m_unitRegTable.end()) {

@ -222,10 +222,18 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
// validate the source RID // validate the source RID
if (!acl::AccessControl::validateSrcId(srcId)) { if (!acl::AccessControl::validateSrcId(srcId)) {
LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId); if (m_lastRejectId == 0U || m_lastRejectId != 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)); LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId);
m_p25->m_trunk->denialInhibit(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->checkAndReject(); 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; return false;
} }
@ -233,18 +241,34 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
if (!m_rfLC.getGroup()) { if (!m_rfLC.getGroup()) {
// validate the target RID // validate the target RID
if (!acl::AccessControl::validateSrcId(dstId)) { if (!acl::AccessControl::validateSrcId(dstId)) {
LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId); if (m_lastRejectId == 0 || m_lastRejectId != dstId) {
m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_NOT_VALID, TSBK_IOSP_UU_VCH); LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId);
m_p25->checkAndReject(); 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; return false;
} }
} }
else { else {
// validate the target ID, if the target is a talkgroup // validate the target ID, if the target is a talkgroup
if (!acl::AccessControl::validateTGId(dstId)) { if (!acl::AccessControl::validateTGId(dstId)) {
LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId); if (m_lastRejectId == 0 || m_lastRejectId != dstId) {
m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_TGT_GROUP_NOT_VALID, TSBK_IOSP_GRP_VCH); LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId);
m_p25->checkAndReject(); 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; 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_rfLC.getGroup() && m_p25->m_control) {
if (!m_p25->m_trunk->hasSrcIdGrpAff(srcId, dstId) && if (!m_p25->m_trunk->hasSrcIdGrpAff(srcId, dstId) &&
m_p25->m_trunk->m_verifyAff) { m_p25->m_trunk->m_verifyAff) {
LogWarning(LOG_RF, P25_HDU_STR " denial, RID not affiliated to TGID, srcId = %u, dstId = %u", srcId, dstId); if (m_lastRejectId == 0 || m_lastRejectId != srcId) {
m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_AUTH, TSBK_IOSP_GRP_VCH); LogWarning(LOG_RF, P25_HDU_STR " denial, RID not affiliated to TGID, srcId = %u, dstId = %u", srcId, dstId);
m_p25->m_trunk->writeRF_TSDU_U_Reg_Cmd(srcId); m_p25->m_trunk->writeRF_TSDU_Deny(P25_DENY_RSN_REQ_UNIT_NOT_AUTH, TSBK_IOSP_GRP_VCH);
m_p25->checkAndReject(); 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; 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_p25->m_control) {
if (m_rfLC.getGroup() && (m_lastPatchGroup != dstId) && 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_rfState == RS_RF_AUDIO) {
if (m_p25->m_rssi != 0U) { 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, 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); m_p25->m_aveRSSI / m_p25->m_rssiCount);
} }
else { 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)); 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_lastDUID(P25_DUID_TDU),
m_lastIMBE(NULL), m_lastIMBE(NULL),
m_hadVoice(false), m_hadVoice(false),
m_lastRejectId(0U),
m_lastPatchGroup(0U), m_lastPatchGroup(0U),
m_silenceThreshold(124U), m_silenceThreshold(124U),
m_verbose(verbose), 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); 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.reset();
m_rfLC.setMI(mi); m_rfLC.setMI(mi);

@ -97,6 +97,7 @@ namespace p25
uint8_t m_lastDUID; uint8_t m_lastDUID;
uint8_t* m_lastIMBE; uint8_t* m_lastIMBE;
bool m_hadVoice; bool m_hadVoice;
uint32_t m_lastRejectId;
uint32_t m_lastPatchGroup; uint32_t m_lastPatchGroup;

Loading…
Cancel
Save

Powered by TurnKey Linux.