diff --git a/configs/config.example.yml b/configs/config.example.yml index 07d7acfc..adc7a1ab 100644 --- a/configs/config.example.yml +++ b/configs/config.example.yml @@ -295,6 +295,11 @@ protocols: unitToUnitAvailCheck: false # Flag indicating explicit source ID support is enabled. allowExplicitSourceId: false + # Flag indicating whether or not the host will disable sending deny responses when operating in conventional. + # (Some subscriber radios do not handle deny responses in conventional, and rather interpret them as + # a emergency call trigger, this option allows the deny response to be disabled to prevent errant emergency + # call triggers.) + disableDenyResponse: false # Flag indicating whether or not the host will respond to SNDCP data requests. sndcpSupport: false # BER/Error threshold for silencing voice packets. (0 or 1233 disables) diff --git a/src/host/p25/Control.cpp b/src/host/p25/Control.cpp index 839a0297..96e86cdc 100644 --- a/src/host/p25/Control.cpp +++ b/src/host/p25/Control.cpp @@ -87,6 +87,7 @@ Control::Control(bool authoritative, uint32_t nac, uint32_t callHang, uint32_t q m_forceAllowTG0(false), m_immediateCallTerm(true), m_explicitTDUGrantRelease(true), + m_disableDenyResponse(false), m_defaultNetIdleTalkgroup(0U), m_idenTable(idenTable), m_ridLookup(ridLookup), @@ -371,6 +372,7 @@ void Control::setOptions(yaml::Node& conf, bool supervisor, const std::string cw m_immediateCallTerm = p25Protocol["immediateCallTerm"].as(true); m_explicitTDUGrantRelease = p25Protocol["explicitTDUGrantRelease"].as(true); + m_disableDenyResponse = p25Protocol["disableDenyResponse"].as(false); /* ** Voice Silence and Frame Loss Thresholds diff --git a/src/host/p25/Control.h b/src/host/p25/Control.h index 9f428b27..1e7a7251 100644 --- a/src/host/p25/Control.h +++ b/src/host/p25/Control.h @@ -318,6 +318,7 @@ namespace p25 bool m_forceAllowTG0; bool m_immediateCallTerm; bool m_explicitTDUGrantRelease; + bool m_disableDenyResponse; uint32_t m_defaultNetIdleTalkgroup; diff --git a/src/host/p25/packet/ControlSignaling.cpp b/src/host/p25/packet/ControlSignaling.cpp index f169319f..e95a3568 100644 --- a/src/host/p25/packet/ControlSignaling.cpp +++ b/src/host/p25/packet/ControlSignaling.cpp @@ -2780,6 +2780,13 @@ void ControlSignaling::writeRF_TSDU_Deny(uint32_t srcId, uint32_t dstId, uint8_t osp->getSrcId(), osp->getDstId()); } + // are deny responses disabled? + if (!m_p25->m_dedicatedControl && !m_p25->m_controlOnly && m_p25->m_disableDenyResponse) { + // at least ACK the request to try to silence the sender + writeRF_TSDU_ACK_FNE(srcId, service, aiv, false); + return; + } + writeRF_TSDU_SBF_Imm(osp.get(), false); }