From 6834e9f49a00449d947ceb80b4bf1345a6b032c8 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Tue, 11 Oct 2022 09:48:35 -0400 Subject: [PATCH] add "emergDisabled" flag to p25 protocol stanza to selectively disable emergency support (emergency support is disabled by default); --- config.example.yml | 1 + p25/Control.cpp | 4 ++++ p25/Control.h | 1 + p25/packet/Trunk.cpp | 37 +++++++++++++++++++++++++------------ 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/config.example.yml b/config.example.yml index 55f31563..dd91c045 100644 --- a/config.example.yml +++ b/config.example.yml @@ -77,6 +77,7 @@ protocols: sndcpGrant: false silenceThreshold: 124 disableNetworkHDU: false + emergDisabled: true queueSize: 12 verbose: true debug: false diff --git a/p25/Control.cpp b/p25/Control.cpp index 83f8e8f4..f1cb311e 100644 --- a/p25/Control.cpp +++ b/p25/Control.cpp @@ -102,6 +102,7 @@ Control::Control(uint32_t nac, uint32_t callHang, uint32_t queueSize, modem::Mod m_voiceOnControl(false), m_ackTSBKRequests(true), m_disableNetworkHDU(false), + m_emergDisabled(true), m_idenTable(idenTable), m_ridLookup(ridLookup), m_tidLookup(tidLookup), @@ -303,6 +304,8 @@ void Control::setOptions(yaml::Node& conf, const std::string cwCallsign, const s uint32_t ccBcstInterval = p25Protocol["control"]["interval"].as(300U); m_trunk->m_adjSiteUpdateInterval += ccBcstInterval; + m_emergDisabled = p25Protocol["emergDisabled"].as(true); + if (printOptions) { LogInfo(" Silence Threshold: %u (%.1f%%)", m_voice->m_silenceThreshold, float(m_voice->m_silenceThreshold) / 12.33F); @@ -315,6 +318,7 @@ void Control::setOptions(yaml::Node& conf, const std::string cwCallsign, const s if (!m_trunk->m_ctrlTSDUMBF) { LogInfo(" Disable Multi-Block TSDUs: yes"); } + LogInfo(" Emergency Support Disabled: %s", m_emergDisabled ? "yes" : "no"); LogInfo(" Inhibit Illegal: %s", m_inhibitIllegal ? "yes" : "no"); LogInfo(" Legacy Group Grant: %s", m_legacyGroupGrnt ? "yes" : "no"); diff --git a/p25/Control.h b/p25/Control.h index 667e59ae..a5d4f8b3 100644 --- a/p25/Control.h +++ b/p25/Control.h @@ -155,6 +155,7 @@ namespace p25 bool m_voiceOnControl; bool m_ackTSBKRequests; bool m_disableNetworkHDU; + bool m_emergDisabled; ::lookups::IdenTableLookup* m_idenTable; ::lookups::RadioIdLookup* m_ridLookup; diff --git a/p25/packet/Trunk.cpp b/p25/packet/Trunk.cpp index 9ca8c35c..452c7232 100644 --- a/p25/packet/Trunk.cpp +++ b/p25/packet/Trunk.cpp @@ -425,18 +425,22 @@ bool Trunk::process(uint8_t* data, uint32_t len, bool preDecoded) writeRF_TSDU_SBF(true); break; case TSBK_ISP_EMERG_ALRM_REQ: - if (m_rfTSBK.getEmergency()) { - if (m_verbose) { - LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_ISP_EMERG_ALRM_REQ (Emergency Alarm Request), srcId = %u, dstId = %u", - srcId, dstId); - } + if (!m_p25->m_emergDisabled) { + if (m_rfTSBK.getEmergency()) { + if (m_verbose) { + LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_ISP_EMERG_ALRM_REQ (Emergency Alarm Request), srcId = %u, dstId = %u", + srcId, dstId); + } - ::ActivityLog("P25", true, "emergency alarm request request from %u", srcId); + ::ActivityLog("P25", true, "emergency alarm request request from %u", srcId); - writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_EMERG_ALRM_REQ, false, true); - if (m_localEmergAlarm) { - writeRF_TSDU_Emerg_Alrm(srcId, dstId); + writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_EMERG_ALRM_REQ, false, true); + if (m_localEmergAlarm) { + writeRF_TSDU_Emerg_Alrm(srcId, dstId); + } } + } else { + LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_EMERG_ALRM_REQ (Emergency Alarm Request) denial, emergency while emergency disabled, srcId = %u", srcId); } break; case TSBK_IOSP_GRP_AFF: @@ -777,9 +781,14 @@ bool Trunk::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::L m_netTSBK.getAIV(), m_netTSBK.getResponse(), m_netTSBK.getSrcId(), m_netTSBK.getDstId()); } } else { - if (m_verbose) { - LogMessage(LOG_NET, P25_TSDU_STR ", TSBK_ISP_EMERG_ALRM_REQ (Emergency Alarm Request), srcId = %u, dstId = %u", - srcId, dstId); + if (!m_p25->m_emergDisabled) { + if (m_verbose) { + LogMessage(LOG_NET, P25_TSDU_STR ", TSBK_ISP_EMERG_ALRM_REQ (Emergency Alarm Request), srcId = %u, dstId = %u", + srcId, dstId); + } + } else { + LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_ISP_EMERG_ALRM_REQ (Emergency Alarm Request) denial, emergency while emergency disabled, srcId = %u", srcId); + return true; // don't allow this to write to the air } } break; @@ -1079,6 +1088,10 @@ void Trunk::writeRF_TSDU_U_Reg_Cmd(uint32_t dstId) /// void Trunk::writeRF_TSDU_Emerg_Alrm(uint32_t srcId, uint32_t dstId) { + if (m_p25->m_emergDisabled) { + return; + } + uint8_t lco = m_rfTSBK.getLCO(); uint32_t _srcId = m_rfTSBK.getSrcId();