From 4671690fe68bc4ddf1eb81ba6bb0ab9e5290f978 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Fri, 26 Nov 2021 14:59:16 +0000 Subject: [PATCH] better handle traffic rejection on DMR; --- dmr/ControlPacket.cpp | 2 ++ dmr/DataPacket.cpp | 2 ++ dmr/Slot.cpp | 16 ++++++++++++++++ dmr/VoicePacket.cpp | 4 ++++ 4 files changed, 24 insertions(+) diff --git a/dmr/ControlPacket.cpp b/dmr/ControlPacket.cpp index 94c6b7ed..f943a92b 100644 --- a/dmr/ControlPacket.cpp +++ b/dmr/ControlPacket.cpp @@ -106,6 +106,7 @@ bool ControlPacket::process(uint8_t* data, uint32_t len) // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); + m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -113,6 +114,7 @@ bool ControlPacket::process(uint8_t* data, uint32_t len) if (gi) { if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { LogWarning(LOG_RF, "DMR Slot %u, DT_CSBK denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); + m_slot->m_rfState = RS_RF_REJECTED; return false; } } diff --git a/dmr/DataPacket.cpp b/dmr/DataPacket.cpp index b8a62104..90c08667 100644 --- a/dmr/DataPacket.cpp +++ b/dmr/DataPacket.cpp @@ -154,6 +154,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len) // validate the source RID if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, "DMR Slot %u, DT_DATA_HEADER denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); + m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -161,6 +162,7 @@ bool DataPacket::process(uint8_t* data, uint32_t len) if (gi) { if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { LogWarning(LOG_RF, "DMR Slot %u, DT_DATA_HEADER denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); + m_slot->m_rfState = RS_RF_REJECTED; return false; } } diff --git a/dmr/Slot.cpp b/dmr/Slot.cpp index 45c6c8ad..5d0da21a 100644 --- a/dmr/Slot.cpp +++ b/dmr/Slot.cpp @@ -485,6 +485,22 @@ void Slot::clock() m_packetTimer.start(); } } + + if (m_rfState == RS_RF_REJECTED) { + m_queue.clear(); + + m_rfFrames = 0U; + m_rfErrs = 0U; + m_rfBits = 1U; + + m_netFrames = 0U; + m_netLost = 0U; + + if (m_network != NULL) + m_network->resetDMR(m_slotNo); + + m_rfState = RS_RF_LISTENING; + } } /// diff --git a/dmr/VoicePacket.cpp b/dmr/VoicePacket.cpp index f1d076d6..8962d05b 100644 --- a/dmr/VoicePacket.cpp +++ b/dmr/VoicePacket.cpp @@ -113,6 +113,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) m_slot->m_rfTGHang.stop(); delete lc; + m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -128,6 +129,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) m_slot->m_rfTGHang.stop(); delete lc; + m_slot->m_rfState = RS_RF_REJECTED; return false; } } @@ -457,6 +459,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) if (!acl::AccessControl::validateSrcId(srcId)) { LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE denial, RID rejection, srcId = %u", m_slot->m_slotNo, srcId); delete lc; + m_slot->m_rfState = RS_RF_REJECTED; return false; } @@ -465,6 +468,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len) if (!acl::AccessControl::validateTGId(m_slot->m_slotNo, dstId)) { LogWarning(LOG_RF, "DMR Slot %u, DT_VOICE denial, TGID rejection, srcId = %u, dstId = %u", m_slot->m_slotNo, srcId, dstId); delete lc; + m_slot->m_rfState = RS_RF_REJECTED; return false; } }