diff --git a/src/common/p25/P25Defines.h b/src/common/p25/P25Defines.h index b2aec8ad..1cb9d332 100644 --- a/src/common/p25/P25Defines.h +++ b/src/common/p25/P25Defines.h @@ -159,20 +159,31 @@ namespace p25 const uint32_t P25_DENY_RSN_REQ_UNIT_NOT_VALID = 0x10U; const uint32_t P25_DENY_RSN_REQ_UNIT_NOT_AUTH = 0x11U; + const uint32_t P25_DENY_RSN_TGT_UNIT_NOT_VALID = 0x20U; const uint32_t P25_DENY_RSN_TGT_UNIT_NOT_AUTH = 0x21U; const uint32_t P25_DENY_RSN_SU_FAILED_AUTH = 0x22U; const uint32_t P25_DENY_RSN_TGT_UNIT_REFUSED = 0x2FU; + const uint32_t P25_DENY_RSN_TGT_GROUP_NOT_VALID = 0x30U; const uint32_t P25_DENY_RSN_TGT_GROUP_NOT_AUTH = 0x31U; + + const uint32_t P25_DENY_RSN_NO_NET_RSRC_AVAIL = 0x53U; + const uint32_t P25_DENY_RSN_NO_RF_RSRC_AVAIL = 0x54U; + const uint32_t P25_DENY_RSN_SVC_IN_USE = 0x55U; + const uint32_t P25_DENY_RSN_SITE_ACCESS_DENIAL = 0x60U; + const uint32_t P25_DENY_RSN_PTT_COLLIDE = 0x67U; 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; const uint32_t P25_EXT_FNCT_CHECK = 0x0000U; // Radio Check diff --git a/src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp b/src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp index 07c783e0..d2531ace 100644 --- a/src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp +++ b/src/common/p25/lc/tsbk/IOSP_ACK_RSP.cpp @@ -70,7 +70,7 @@ void IOSP_ACK_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) ulong64_t tsbkValue = 0U; - tsbkValue = (m_service & 0x3F); // Service Type + tsbkValue = (m_service & 0x3FU); // Service Type tsbkValue |= (m_aivFlag) ? 0x80U : 0x00U; // Additional Info. Valid Flag tsbkValue |= (m_extendedAddrFlag) ? 0x40U : 0x00U; // Extended Addressing Flag if (m_aivFlag && m_extendedAddrFlag) { diff --git a/src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp b/src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp index aa05ea06..febd7e75 100644 --- a/src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp +++ b/src/common/p25/lc/tsbk/OSP_DENY_RSP.cpp @@ -77,21 +77,23 @@ void OSP_DENY_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) return; // blatantly ignore creating this TSBK } - tsbkValue = (m_aivFlag) ? 0x80U : 0x00U; // Additional Info Flag - tsbkValue = (tsbkValue << 6) + m_service; // Service Type + tsbkValue = (m_service & 0x3FU); // Service Type + tsbkValue |= (m_aivFlag) ? 0x80U : 0x00U; // Additional Info. Valid Flag tsbkValue = (tsbkValue << 8) + m_response; // Deny/Queue Reason - - if (m_group) { - // group deny/queue - tsbkValue = (tsbkValue << 8) + 0U; // Call Options - tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address - tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address - } - else { - // private/individual deny/queue - tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address - tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address + if (m_aivFlag) { + if (m_group) { + // group deny/queue + tsbkValue = (tsbkValue << 8) + 0U; // Call Options + tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address + } + else { + // private/individual deny/queue + tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address + } + } else { + tsbkValue = (tsbkValue << 24) + 0U; } + tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address std::unique_ptr tsbk = TSBK::fromValue(tsbkValue); TSBK::encode(data, tsbk.get(), rawTSBK, noTrellis); diff --git a/src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp b/src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp index 0530195d..9ab7c920 100644 --- a/src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp +++ b/src/common/p25/lc/tsbk/OSP_QUE_RSP.cpp @@ -77,21 +77,23 @@ void OSP_QUE_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis) return; // blatantly ignore creating this TSBK } - tsbkValue = (m_aivFlag) ? 0x80U : 0x00U; // Additional Info Flag - tsbkValue = (tsbkValue << 6) + (m_service & 0x3FU); // Service Type + tsbkValue = (m_service & 0x3FU); // Service Type + tsbkValue |= (m_aivFlag) ? 0x80U : 0x00U; // Additional Info. Valid Flag tsbkValue = (tsbkValue << 8) + m_response; // Deny/Queue Reason - - if (m_group) { - // group deny/queue - tsbkValue = (tsbkValue << 8) + 0U; // Call Options - tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address - tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address - } - else { - // private/individual deny/queue - tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address - tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address + if (m_aivFlag) { + if (m_group) { + // group deny/queue + tsbkValue = (tsbkValue << 8) + 0U; // Call Options + tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address + } + else { + // private/individual deny/queue + tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address + } + } else { + tsbkValue = (tsbkValue << 24) + 0U; } + tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address std::unique_ptr tsbk = TSBK::fromValue(tsbkValue); TSBK::encode(data, tsbk.get(), rawTSBK, noTrellis); diff --git a/src/fne/network/fne/TagP25Data.cpp b/src/fne/network/fne/TagP25Data.cpp index 03e2de8e..40afb9cc 100644 --- a/src/fne/network/fne/TagP25Data.cpp +++ b/src/fne/network/fne/TagP25Data.cpp @@ -1049,8 +1049,9 @@ bool TagP25Data::validate(uint32_t peerId, lc::LC& control, uint8_t duid, const /// /// /// +/// /// -void TagP25Data::write_TSDU_Deny(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv) +void TagP25Data::write_TSDU_Deny(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool grp, bool aiv) { std::unique_ptr osp = std::make_unique(); osp->setAIV(aiv); @@ -1058,6 +1059,7 @@ void TagP25Data::write_TSDU_Deny(uint32_t peerId, uint32_t srcId, uint32_t dstId osp->setDstId(dstId); osp->setService(service); osp->setResponse(reason); + osp->setGroup(grp); if (m_network->m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", %s, AIV = %u, reason = $%02X, srcId = %u, dstId = %u", @@ -1074,9 +1076,9 @@ void TagP25Data::write_TSDU_Deny(uint32_t peerId, uint32_t srcId, uint32_t dstId /// /// /// -/// /// -void TagP25Data::write_TSDU_Queue(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv, bool grp) +/// +void TagP25Data::write_TSDU_Queue(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool grp, bool aiv) { std::unique_ptr osp = std::make_unique(); osp->setAIV(aiv); diff --git a/src/fne/network/fne/TagP25Data.h b/src/fne/network/fne/TagP25Data.h index 64800c16..9b479c83 100644 --- a/src/fne/network/fne/TagP25Data.h +++ b/src/fne/network/fne/TagP25Data.h @@ -113,9 +113,9 @@ namespace network bool validate(uint32_t peerId, p25::lc::LC& control, uint8_t duid, const p25::lc::TSBK* tsbk, uint32_t streamId); /// Helper to write a deny packet. - void write_TSDU_Deny(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv = false); + void write_TSDU_Deny(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool group = false, bool aiv = false); /// Helper to write a queue packet. - void write_TSDU_Queue(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv = false, bool group = true); + void write_TSDU_Queue(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool group = false, bool aiv = false); /// Helper to write a network TSDU. void write_TSDU(uint32_t peerId, p25::lc::TSBK* tsbk); diff --git a/src/host/p25/packet/ControlSignaling.cpp b/src/host/p25/packet/ControlSignaling.cpp index 3893b88c..18d71411 100644 --- a/src/host/p25/packet/ControlSignaling.cpp +++ b/src/host/p25/packet/ControlSignaling.cpp @@ -46,7 +46,7 @@ using namespace p25::packet; #define IS_SUPPORT_CONTROL_CHECK(_PCKT_STR, _PCKT, _SRCID) \ if (!m_p25->m_enableControl) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, unsupported service, srcId = %u", _PCKT_STR.c_str(), _SRCID); \ - writeRF_TSDU_Deny(P25_WUID_FNE, _SRCID, P25_DENY_RSN_SYS_UNSUPPORTED_SVC, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, P25_WUID_FNE, P25_DENY_RSN_SYS_UNSUPPORTED_SVC, _PCKT); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ } @@ -55,7 +55,7 @@ using namespace p25::packet; #define VALID_SRCID(_PCKT_STR, _PCKT, _SRCID) \ if (!acl::AccessControl::validateSrcId(_SRCID)) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID rejection, srcId = %u", _PCKT_STR.c_str(), _SRCID); \ - writeRF_TSDU_Deny(P25_WUID_FNE, _SRCID, P25_DENY_RSN_REQ_UNIT_NOT_VALID, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, P25_WUID_FNE, P25_DENY_RSN_REQ_UNIT_NOT_VALID, _PCKT); \ denialInhibit(_SRCID); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ @@ -83,7 +83,7 @@ using namespace p25::packet; #define VERIFY_SRCID_REG(_PCKT_STR, _PCKT, _SRCID) \ if (!m_p25->m_affiliations.isUnitReg(_SRCID) && m_verifyReg) { \ LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID not registered, srcId = %u", _PCKT_STR.c_str(), _SRCID); \ - writeRF_TSDU_Deny(P25_WUID_FNE, _SRCID, P25_DENY_RSN_REQ_UNIT_NOT_AUTH, _PCKT); \ + writeRF_TSDU_Deny(_SRCID, P25_WUID_FNE, P25_DENY_RSN_REQ_UNIT_NOT_AUTH, _PCKT); \ writeRF_TSDU_U_Reg_Cmd(_SRCID); \ m_p25->m_rfState = RS_RF_REJECTED; \ return false; \ @@ -309,10 +309,10 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrgetResponse() == P25_ANS_RSP_DENY) { - writeRF_TSDU_Deny(P25_WUID_FNE, dstId, P25_DENY_RSN_TGT_UNIT_REFUSED, TSBK_IOSP_UU_ANS); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_TGT_UNIT_REFUSED, TSBK_IOSP_UU_ANS); } else if (iosp->getResponse() == P25_ANS_RSP_WAIT) { - writeRF_TSDU_Queue(P25_WUID_FNE, dstId, P25_QUE_RSN_TGT_UNIT_QUEUED, TSBK_IOSP_UU_ANS, false, false); + writeRF_TSDU_Queue(srcId, dstId, P25_QUE_RSN_TGT_UNIT_QUEUED, TSBK_IOSP_UU_ANS); } } break; @@ -324,7 +324,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString(true), TSBK_IOSP_TELE_INT_ANS, srcId); - writeRF_TSDU_Deny(P25_WUID_FNE, srcId, P25_DENY_RSN_SYS_UNSUPPORTED_SVC, TSBK_IOSP_TELE_INT_ANS); + writeRF_TSDU_Deny(srcId, P25_WUID_FNE, P25_DENY_RSN_SYS_UNSUPPORTED_SVC, TSBK_IOSP_TELE_INT_ANS); } break; case TSBK_ISP_SNDCP_CH_REQ: @@ -345,7 +345,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptrtoString().c_str(), srcId); ::ActivityLog("P25", true, "unit registration request from %u denied, authentication failure", srcId); - writeRF_TSDU_Deny(P25_WUID_FNE, srcId, P25_DENY_RSN_SU_FAILED_AUTH, TSBK_IOSP_U_REG); + writeRF_TSDU_Deny(srcId, P25_WUID_FNE, P25_DENY_RSN_SU_FAILED_AUTH, TSBK_IOSP_U_REG); } } break; @@ -2087,7 +2087,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (m_p25->m_netState != RS_NET_IDLE && dstId == m_p25->m_netLastDstId) { LogWarning(LOG_RF, "Traffic collision detect, preempting new RF traffic to existing network traffic!"); LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; @@ -2105,7 +2105,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_rfState != RS_RF_DATA) { if (!net) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; @@ -2122,7 +2122,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (m_p25->m_netState != RS_NET_IDLE && dstId == m_p25->m_netLastDstId) { if (!net) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; @@ -2138,7 +2138,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (m_p25->m_rfLastDstId != 0U) { if (m_p25->m_rfLastDstId != dstId && (m_p25->m_rfTGHang.isRunning() && !m_p25->m_rfTGHang.hasExpired())) { if (!net) { - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); m_p25->m_rfState = RS_RF_REJECTED; } @@ -2151,28 +2151,28 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (!m_p25->m_affiliations.rfCh()->isRFChAvailable()) { if (grp) { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) queued, no channels available, dstId = %u", dstId); - writeRF_TSDU_Queue(srcId, dstId, P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_IOSP_GRP_VCH); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, no channels available, dstId = %u", dstId); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_NO_RF_RSRC_AVAIL, TSBK_IOSP_GRP_VCH, grp, true); - ::ActivityLog("P25", true, "group grant request from %u to TG %u queued", srcId, dstId); + ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; } else { - LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) queued, no channels available, dstId = %u", dstId); + LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, no channels available, dstId = %u", dstId); } return false; } else { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) queued, no channels available, dstId = %u", dstId); - writeRF_TSDU_Queue(srcId, dstId, P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_IOSP_UU_VCH); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) denied, no channels available, dstId = %u", dstId); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_NO_RF_RSRC_AVAIL, TSBK_IOSP_GRP_VCH, grp, true); - ::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u queued", srcId, dstId); + ::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; } else { - LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) queued, no channels available, dstId = %u", dstId); + LogWarning(LOG_NET, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) denied, no channels available, dstId = %u", dstId); } return false; @@ -2193,7 +2193,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ if (srcId != grantedSrcId) { if (!net) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId); m_p25->m_rfState = RS_RF_REJECTED; @@ -2243,7 +2243,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Grant), failed to permit TG for use, chNo = %u", chNo); m_p25->m_affiliations.releaseGrant(dstId, false); if (!net) { - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); m_p25->m_rfState = RS_RF_REJECTED; } @@ -2297,7 +2297,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_ ::LogError((net) ? LOG_NET : LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Grant), failed to permit TG for use, chNo = %u", chNo); m_p25->m_affiliations.releaseGrant(dstId, false); if (!net) { - writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH, grp, true); m_p25->m_rfState = RS_RF_REJECTED; } @@ -2440,9 +2440,9 @@ bool ControlSignaling::writeRF_TSDU_SNDCP_Grant(uint32_t srcId, uint32_t dstId, if (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_rfState != RS_RF_DATA) { if (!net) { LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) denied, traffic in progress, srcId = %u", srcId); - writeRF_TSDU_Queue(srcId, dstId, P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_ISP_SNDCP_CH_REQ); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_PTT_COLLIDE, TSBK_ISP_SNDCP_CH_REQ, false, true); - ::ActivityLog("P25", true, "SNDCP grant request from %u queued", srcId); + ::ActivityLog("P25", true, "SNDCP grant request from %u denied", srcId); m_p25->m_rfState = RS_RF_REJECTED; } @@ -2452,10 +2452,10 @@ bool ControlSignaling::writeRF_TSDU_SNDCP_Grant(uint32_t srcId, uint32_t dstId, if (!m_p25->m_affiliations.isGranted(srcId)) { if (!m_p25->m_affiliations.rfCh()->isRFChAvailable()) { if (!net) { - LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) queued, no channels available, srcId = %u", srcId); - writeRF_TSDU_Queue(srcId, dstId, P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_ISP_SNDCP_CH_REQ); + LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) denied, no channels available, srcId = %u", srcId); + writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_NO_RF_RSRC_AVAIL, TSBK_ISP_SNDCP_CH_REQ, false, true); - ::ActivityLog("P25", true, "SNDCP grant request from %u queued", srcId); + ::ActivityLog("P25", true, "SNDCP grant request from %u denied", srcId); m_p25->m_rfState = RS_RF_REJECTED; } @@ -2551,8 +2551,9 @@ void ControlSignaling::writeRF_TSDU_ACK_FNE(uint32_t srcId, uint32_t service, bo /// /// /// +/// /// -void ControlSignaling::writeRF_TSDU_Deny(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv) +void ControlSignaling::writeRF_TSDU_Deny(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool grp, bool aiv) { std::unique_ptr osp = std::make_unique(); osp->setAIV(aiv); @@ -2560,6 +2561,7 @@ void ControlSignaling::writeRF_TSDU_Deny(uint32_t srcId, uint32_t dstId, uint8_t osp->setDstId(dstId); osp->setService(service); osp->setResponse(reason); + osp->setGroup(grp); if (m_verbose) { LogMessage(LOG_RF, P25_TSDU_STR ", %s, AIV = %u, reason = $%02X, srcId = %u, dstId = %u", @@ -2731,9 +2733,9 @@ void ControlSignaling::writeRF_TSDU_U_Dereg_Ack(uint32_t srcId) /// /// /// -/// /// -void ControlSignaling::writeRF_TSDU_Queue(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv, bool grp) +/// +void ControlSignaling::writeRF_TSDU_Queue(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool grp, bool aiv) { std::unique_ptr osp = std::make_unique(); osp->setAIV(aiv); diff --git a/src/host/p25/packet/ControlSignaling.h b/src/host/p25/packet/ControlSignaling.h index e381b6d7..d12eaf28 100644 --- a/src/host/p25/packet/ControlSignaling.h +++ b/src/host/p25/packet/ControlSignaling.h @@ -196,7 +196,7 @@ namespace p25 /// Helper to write a acknowledge packet. void writeRF_TSDU_ACK_FNE(uint32_t srcId, uint32_t service, bool extended, bool noActivityLog); /// Helper to write a deny packet. - void writeRF_TSDU_Deny(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv = false); + void writeRF_TSDU_Deny(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool grp = false, bool aiv = false); /// Helper to write a group affiliation response packet. bool writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId); /// Helper to write a unit registration response packet. @@ -204,7 +204,7 @@ namespace p25 /// Helper to write a unit de-registration acknowledge packet. void writeRF_TSDU_U_Dereg_Ack(uint32_t srcId); /// Helper to write a queue packet. - void writeRF_TSDU_Queue(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv = false, bool group = true); + void writeRF_TSDU_Queue(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool grp = false, bool aiv = false); /// Helper to write a location registration response packet. bool writeRF_TSDU_Loc_Reg_Rsp(uint32_t srcId, uint32_t dstId, bool grp); diff --git a/src/host/p25/packet/Voice.cpp b/src/host/p25/packet/Voice.cpp index 4a522506..23988de7 100644 --- a/src/host/p25/packet/Voice.cpp +++ b/src/host/p25/packet/Voice.cpp @@ -286,7 +286,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_lastRejectId == 0U || m_lastRejectId != srcId) { LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId); if (m_p25->m_enableControl) { - m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_REQ_UNIT_NOT_VALID, (group ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH)); + m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_REQ_UNIT_NOT_VALID, (group ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH), group, true); m_p25->m_control->denialInhibit(srcId); } @@ -308,7 +308,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_lastRejectId == 0 || m_lastRejectId != dstId) { LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId); if (m_p25->m_enableControl) { - m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_TGT_UNIT_NOT_VALID, TSBK_IOSP_UU_VCH); + m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_TGT_UNIT_NOT_VALID, TSBK_IOSP_UU_VCH, false, true); } ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, group ? "TG " : "", dstId); @@ -328,7 +328,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (m_lastRejectId == 0 || m_lastRejectId != dstId) { LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId); if (m_p25->m_enableControl) { - m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_TGT_GROUP_NOT_VALID, TSBK_IOSP_GRP_VCH); + m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_TGT_GROUP_NOT_VALID, TSBK_IOSP_GRP_VCH, true, true); } ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, group ? "TG " : "", dstId); @@ -349,7 +349,7 @@ bool Voice::process(uint8_t* data, uint32_t len) if (!m_p25->m_affiliations.isGroupAff(srcId, dstId) && m_p25->m_control->m_verifyAff) { if (m_lastRejectId == 0 || m_lastRejectId != srcId) { LogWarning(LOG_RF, P25_HDU_STR " denial, RID not affiliated to TGID, srcId = %u, dstId = %u", srcId, dstId); - m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_REQ_UNIT_NOT_AUTH, TSBK_IOSP_GRP_VCH); + m_p25->m_control->writeRF_TSDU_Deny(srcId, dstId, P25_DENY_RSN_REQ_UNIT_NOT_AUTH, TSBK_IOSP_GRP_VCH, true, true); m_p25->m_control->writeRF_TSDU_U_Reg_Cmd(srcId); ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, group ? "TG " : "", dstId);