diff --git a/config.example.yml b/config.example.yml index 349f8e8f..ff09bc4b 100644 --- a/config.example.yml +++ b/config.example.yml @@ -68,6 +68,7 @@ protocols: callHang: 5 noStatusAck: false noMessageAck: true + unitToUnitAvailCheck: true silenceThreshold: 124 disableNetworkHDU: false queueSize: 5000 diff --git a/p25/Control.cpp b/p25/Control.cpp index e13cdd30..b3b4db09 100644 --- a/p25/Control.cpp +++ b/p25/Control.cpp @@ -200,6 +200,7 @@ void Control::setOptions(yaml::Node& conf, const std::string cwCallsign, const s m_trunk->m_noStatusAck = p25Protocol["noStatusAck"].as(false); m_trunk->m_noMessageAck = p25Protocol["noMessageAck"].as(true); + m_trunk->m_unitToUnitAvailCheck = p25Protocol["unitToUnitAvailCheck"].as(true); yaml::Node control = p25Protocol["control"]; m_control = control["enable"].as(false); @@ -275,6 +276,7 @@ void Control::setOptions(yaml::Node& conf, const std::string cwCallsign, const s LogInfo(" No Status ACK: %s", m_trunk->m_noStatusAck ? "yes" : "no"); LogInfo(" No Message ACK: %s", m_trunk->m_noMessageAck ? "yes" : "no"); + LogInfo(" Unit-to-Unit Availability Check: %s", m_trunk->m_unitToUnitAvailCheck ? "yes" : "no"); } m_voice->resetRF(); diff --git a/p25/P25Defines.h b/p25/P25Defines.h index 7940848c..09503f02 100644 --- a/p25/P25Defines.h +++ b/p25/P25Defines.h @@ -181,6 +181,8 @@ namespace p25 const uint32_t P25_DENY_RSN_PTT_BONK = 0x77U; const uint32_t P25_DENY_RSN_SYS_UNSUPPORTED_SVC = 0xFFU; + const uint32_t P25_QUE_RSN_REQ_ACTIVE_SERVICE = 0x10U; + const uint32_t P25_QUE_RSN_TGT_ACTIVE_SERVICE = 0x20U; const uint32_t P25_QUE_RSN_TGT_UNIT_QUEUED = 0x2FU; const uint32_t P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL = 0x40U; diff --git a/p25/TrunkPacket.cpp b/p25/TrunkPacket.cpp index cd31abfb..e10d8710 100644 --- a/p25/TrunkPacket.cpp +++ b/p25/TrunkPacket.cpp @@ -236,7 +236,12 @@ 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); } - writeRF_TSDU_UU_Ans_Req(srcId, dstId); + if (m_unitToUnitAvailCheck) { + writeRF_TSDU_UU_Ans_Req(srcId, dstId); + } + else { + writeRF_TSDU_Grant(false, false, false); + } break; case TSBK_IOSP_UU_ANS: // make sure control data is supported @@ -253,10 +258,6 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) m_rfTSBK.getResponse(), srcId, dstId); } - if (m_p25->m_ackTSBKRequests) { - writeRF_TSDU_ACK_FNE(srcId, TSBK_IOSP_UU_ANS, false, true); - } - if (m_rfTSBK.getResponse() == P25_ANS_RSP_PROCEED) { writeRF_TSDU_Grant(false, false, false); } @@ -283,16 +284,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) writeRF_TSDU_ACK_FNE(srcId, TSBK_IOSP_TELE_INT_ANS, false, true); } - if (m_rfTSBK.getResponse() == P25_ANS_RSP_PROCEED) { - //writeRF_TSDU_Grant(false); - writeRF_TSDU_Deny(P25_DENY_RSN_SYS_UNSUPPORTED_SVC, TSBK_IOSP_TELE_INT_ANS); - } - else if (m_rfTSBK.getResponse() == P25_ANS_RSP_DENY) { - writeRF_TSDU_ACK_FNE(srcId, TSBK_IOSP_TELE_INT_ANS, false, true); - } - else if (m_rfTSBK.getResponse() == P25_ANS_RSP_WAIT) { - writeRF_TSDU_Queue(P25_QUE_RSN_TGT_UNIT_QUEUED, TSBK_IOSP_TELE_INT_ANS); - } + writeRF_TSDU_Deny(P25_DENY_RSN_SYS_UNSUPPORTED_SVC, TSBK_IOSP_TELE_INT_ANS); break; case TSBK_ISP_SNDCP_CH_REQ: // make sure control data is supported @@ -420,7 +412,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len) ::ActivityLog("P25", true, "emergency alarm request request from %u", srcId); - writeRF_TSDU_SBF(false); + writeRF_TSDU_ACK_FNE(srcId, TSBK_ISP_EMERG_ALRM_REQ, false, true); } break; case TSBK_IOSP_GRP_AFF: @@ -1214,6 +1206,7 @@ TrunkPacket::TrunkPacket(Control* p25, network::BaseNetwork* network, bool dumpT m_voiceGrantChCnt(0U), m_noStatusAck(false), m_noMessageAck(true), + m_unitToUnitAvailCheck(true), m_adjSiteUpdateTimer(1000U), m_adjSiteUpdateInterval(ADJ_SITE_TIMER_TIMEOUT), m_ctrlTSDUMBF(true), diff --git a/p25/TrunkPacket.h b/p25/TrunkPacket.h index f94e9052..772716ae 100644 --- a/p25/TrunkPacket.h +++ b/p25/TrunkPacket.h @@ -150,6 +150,7 @@ namespace p25 bool m_noStatusAck; bool m_noMessageAck; + bool m_unitToUnitAvailCheck; Timer m_adjSiteUpdateTimer; uint32_t m_adjSiteUpdateInterval;