fix incorrect assembly of DENY TSDUs for certain services; replace QUEUE TSDUs for grant TSDUs with DENY TSDUs;

pull/55/head
Bryan Biedenkapp 2 years ago
parent 864044ff8b
commit 9b6fcdbdf7

@ -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_VALID = 0x10U;
const uint32_t P25_DENY_RSN_REQ_UNIT_NOT_AUTH = 0x11U; 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_VALID = 0x20U;
const uint32_t P25_DENY_RSN_TGT_UNIT_NOT_AUTH = 0x21U; 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_SU_FAILED_AUTH = 0x22U;
const uint32_t P25_DENY_RSN_TGT_UNIT_REFUSED = 0x2FU; 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_VALID = 0x30U;
const uint32_t P25_DENY_RSN_TGT_GROUP_NOT_AUTH = 0x31U; 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_SITE_ACCESS_DENIAL = 0x60U;
const uint32_t P25_DENY_RSN_PTT_COLLIDE = 0x67U; const uint32_t P25_DENY_RSN_PTT_COLLIDE = 0x67U;
const uint32_t P25_DENY_RSN_PTT_BONK = 0x77U; const uint32_t P25_DENY_RSN_PTT_BONK = 0x77U;
const uint32_t P25_DENY_RSN_SYS_UNSUPPORTED_SVC = 0xFFU; 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_REQ_ACTIVE_SERVICE = 0x10U;
const uint32_t P25_QUE_RSN_TGT_ACTIVE_SERVICE = 0x20U; 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_TGT_UNIT_QUEUED = 0x2FU;
const uint32_t P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL = 0x40U; const uint32_t P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL = 0x40U;
const uint32_t P25_EXT_FNCT_CHECK = 0x0000U; // Radio Check const uint32_t P25_EXT_FNCT_CHECK = 0x0000U; // Radio Check

@ -70,7 +70,7 @@ void IOSP_ACK_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
ulong64_t tsbkValue = 0U; 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_aivFlag) ? 0x80U : 0x00U; // Additional Info. Valid Flag
tsbkValue |= (m_extendedAddrFlag) ? 0x40U : 0x00U; // Extended Addressing Flag tsbkValue |= (m_extendedAddrFlag) ? 0x40U : 0x00U; // Extended Addressing Flag
if (m_aivFlag && m_extendedAddrFlag) { if (m_aivFlag && m_extendedAddrFlag) {

@ -77,21 +77,23 @@ void OSP_DENY_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
return; // blatantly ignore creating this TSBK return; // blatantly ignore creating this TSBK
} }
tsbkValue = (m_aivFlag) ? 0x80U : 0x00U; // Additional Info Flag tsbkValue = (m_service & 0x3FU); // Service Type
tsbkValue = (tsbkValue << 6) + m_service; // Service Type tsbkValue |= (m_aivFlag) ? 0x80U : 0x00U; // Additional Info. Valid Flag
tsbkValue = (tsbkValue << 8) + m_response; // Deny/Queue Reason tsbkValue = (tsbkValue << 8) + m_response; // Deny/Queue Reason
if (m_aivFlag) {
if (m_group) { if (m_group) {
// group deny/queue // group deny/queue
tsbkValue = (tsbkValue << 8) + 0U; // Call Options tsbkValue = (tsbkValue << 8) + 0U; // Call Options
tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address }
} else {
else { // private/individual deny/queue
// private/individual deny/queue tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address
tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address }
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address } else {
tsbkValue = (tsbkValue << 24) + 0U;
} }
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
std::unique_ptr<uint8_t[]> tsbk = TSBK::fromValue(tsbkValue); std::unique_ptr<uint8_t[]> tsbk = TSBK::fromValue(tsbkValue);
TSBK::encode(data, tsbk.get(), rawTSBK, noTrellis); TSBK::encode(data, tsbk.get(), rawTSBK, noTrellis);

@ -77,21 +77,23 @@ void OSP_QUE_RSP::encode(uint8_t* data, bool rawTSBK, bool noTrellis)
return; // blatantly ignore creating this TSBK return; // blatantly ignore creating this TSBK
} }
tsbkValue = (m_aivFlag) ? 0x80U : 0x00U; // Additional Info Flag tsbkValue = (m_service & 0x3FU); // Service Type
tsbkValue = (tsbkValue << 6) + (m_service & 0x3FU); // Service Type tsbkValue |= (m_aivFlag) ? 0x80U : 0x00U; // Additional Info. Valid Flag
tsbkValue = (tsbkValue << 8) + m_response; // Deny/Queue Reason tsbkValue = (tsbkValue << 8) + m_response; // Deny/Queue Reason
if (m_aivFlag) {
if (m_group) { if (m_group) {
// group deny/queue // group deny/queue
tsbkValue = (tsbkValue << 8) + 0U; // Call Options tsbkValue = (tsbkValue << 8) + 0U; // Call Options
tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address tsbkValue = (tsbkValue << 16) + m_dstId; // Talkgroup Address
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address }
} else {
else { // private/individual deny/queue
// private/individual deny/queue tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address
tsbkValue = (tsbkValue << 24) + m_dstId; // Target Radio Address }
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address } else {
tsbkValue = (tsbkValue << 24) + 0U;
} }
tsbkValue = (tsbkValue << 24) + m_srcId; // Source Radio Address
std::unique_ptr<uint8_t[]> tsbk = TSBK::fromValue(tsbkValue); std::unique_ptr<uint8_t[]> tsbk = TSBK::fromValue(tsbkValue);
TSBK::encode(data, tsbk.get(), rawTSBK, noTrellis); TSBK::encode(data, tsbk.get(), rawTSBK, noTrellis);

@ -1049,8 +1049,9 @@ bool TagP25Data::validate(uint32_t peerId, lc::LC& control, uint8_t duid, const
/// <param name="dstId"></param> /// <param name="dstId"></param>
/// <param name="reason"></param> /// <param name="reason"></param>
/// <param name="service"></param> /// <param name="service"></param>
/// <param name="grp"></param>
/// <param name="aiv"></param> /// <param name="aiv"></param>
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<lc::tsbk::OSP_DENY_RSP> osp = std::make_unique<lc::tsbk::OSP_DENY_RSP>(); std::unique_ptr<lc::tsbk::OSP_DENY_RSP> osp = std::make_unique<lc::tsbk::OSP_DENY_RSP>();
osp->setAIV(aiv); 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->setDstId(dstId);
osp->setService(service); osp->setService(service);
osp->setResponse(reason); osp->setResponse(reason);
osp->setGroup(grp);
if (m_network->m_verbose) { if (m_network->m_verbose) {
LogMessage(LOG_RF, P25_TSDU_STR ", %s, AIV = %u, reason = $%02X, srcId = %u, dstId = %u", 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
/// <param name="dstId"></param> /// <param name="dstId"></param>
/// <param name="reason"></param> /// <param name="reason"></param>
/// <param name="service"></param> /// <param name="service"></param>
/// <param name="aiv"></param>
/// <param name="grp"></param> /// <param name="grp"></param>
void TagP25Data::write_TSDU_Queue(uint32_t peerId, uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv, bool grp) /// <param name="aiv"></param>
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<lc::tsbk::OSP_QUE_RSP> osp = std::make_unique<lc::tsbk::OSP_QUE_RSP>(); std::unique_ptr<lc::tsbk::OSP_QUE_RSP> osp = std::make_unique<lc::tsbk::OSP_QUE_RSP>();
osp->setAIV(aiv); osp->setAIV(aiv);

@ -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); bool validate(uint32_t peerId, p25::lc::LC& control, uint8_t duid, const p25::lc::TSBK* tsbk, uint32_t streamId);
/// <summary>Helper to write a deny packet.</summary> /// <summary>Helper to write a deny packet.</summary>
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);
/// <summary>Helper to write a queue packet.</summary> /// <summary>Helper to write a queue packet.</summary>
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);
/// <summary>Helper to write a network TSDU.</summary> /// <summary>Helper to write a network TSDU.</summary>
void write_TSDU(uint32_t peerId, p25::lc::TSBK* tsbk); void write_TSDU(uint32_t peerId, p25::lc::TSBK* tsbk);

@ -46,7 +46,7 @@ using namespace p25::packet;
#define IS_SUPPORT_CONTROL_CHECK(_PCKT_STR, _PCKT, _SRCID) \ #define IS_SUPPORT_CONTROL_CHECK(_PCKT_STR, _PCKT, _SRCID) \
if (!m_p25->m_enableControl) { \ if (!m_p25->m_enableControl) { \
LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, unsupported service, srcId = %u", _PCKT_STR.c_str(), _SRCID); \ 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; \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ return false; \
} }
@ -55,7 +55,7 @@ using namespace p25::packet;
#define VALID_SRCID(_PCKT_STR, _PCKT, _SRCID) \ #define VALID_SRCID(_PCKT_STR, _PCKT, _SRCID) \
if (!acl::AccessControl::validateSrcId(_SRCID)) { \ if (!acl::AccessControl::validateSrcId(_SRCID)) { \
LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, RID rejection, srcId = %u", _PCKT_STR.c_str(), _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); \ denialInhibit(_SRCID); \
m_p25->m_rfState = RS_RF_REJECTED; \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ return false; \
@ -83,7 +83,7 @@ using namespace p25::packet;
#define VERIFY_SRCID_REG(_PCKT_STR, _PCKT, _SRCID) \ #define VERIFY_SRCID_REG(_PCKT_STR, _PCKT, _SRCID) \
if (!m_p25->m_affiliations.isUnitReg(_SRCID) && m_verifyReg) { \ 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); \ 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); \ writeRF_TSDU_U_Reg_Cmd(_SRCID); \
m_p25->m_rfState = RS_RF_REJECTED; \ m_p25->m_rfState = RS_RF_REJECTED; \
return false; \ return false; \
@ -309,10 +309,10 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr<lc::
} }
} }
else if (iosp->getResponse() == P25_ANS_RSP_DENY) { else if (iosp->getResponse() == 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) { 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; break;
@ -324,7 +324,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr<lc::
// validate the source RID // validate the source RID
VALID_SRCID(tsbk->toString(true), TSBK_IOSP_TELE_INT_ANS, srcId); VALID_SRCID(tsbk->toString(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; break;
case TSBK_ISP_SNDCP_CH_REQ: case TSBK_ISP_SNDCP_CH_REQ:
@ -345,7 +345,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr<lc::
writeRF_TSDU_SNDCP_Grant(false, false); writeRF_TSDU_SNDCP_Grant(false, false);
} }
else { else {
writeRF_TSDU_Deny(P25_WUID_FNE, srcId, P25_DENY_RSN_SYS_UNSUPPORTED_SVC, TSBK_ISP_SNDCP_CH_REQ); writeRF_TSDU_Deny(srcId, P25_WUID_FNE, P25_DENY_RSN_SYS_UNSUPPORTED_SVC, TSBK_ISP_SNDCP_CH_REQ);
} }
} }
break; break;
@ -634,7 +634,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len, std::unique_ptr<lc::
else { else {
LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, AUTH failed, src = %u", isp->toString().c_str(), srcId); LogWarning(LOG_RF, P25_TSDU_STR ", %s denial, AUTH failed, src = %u", isp->toString().c_str(), srcId);
::ActivityLog("P25", true, "unit registration request from %u denied, authentication failure", 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; 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) { 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, "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); 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); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId);
m_p25->m_rfState = RS_RF_REJECTED; 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 (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_rfState != RS_RF_DATA) {
if (!net) { if (!net) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); 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); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId);
m_p25->m_rfState = RS_RF_REJECTED; 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 (m_p25->m_netState != RS_NET_IDLE && dstId == m_p25->m_netLastDstId) {
if (!net) { if (!net) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", dstId); 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); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId);
m_p25->m_rfState = RS_RF_REJECTED; 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 != 0U) {
if (m_p25->m_rfLastDstId != dstId && (m_p25->m_rfTGHang.isRunning() && !m_p25->m_rfTGHang.hasExpired())) { if (m_p25->m_rfLastDstId != dstId && (m_p25->m_rfTGHang.isRunning() && !m_p25->m_rfTGHang.hasExpired())) {
if (!net) { 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; 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 (!m_p25->m_affiliations.rfCh()->isRFChAvailable()) {
if (grp) { if (grp) {
if (!net) { if (!net) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) queued, no channels available, dstId = %u", dstId); LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, no channels available, dstId = %u", dstId);
writeRF_TSDU_Queue(srcId, dstId, P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_IOSP_GRP_VCH); 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; m_p25->m_rfState = RS_RF_REJECTED;
} }
else { 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; return false;
} }
else { else {
if (!net) { 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); 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_Queue(srcId, dstId, P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_IOSP_UU_VCH); 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; m_p25->m_rfState = RS_RF_REJECTED;
} }
else { 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; return false;
@ -2193,7 +2193,7 @@ bool ControlSignaling::writeRF_TSDU_Grant(uint32_t srcId, uint32_t dstId, uint8_
if (srcId != grantedSrcId) { if (srcId != grantedSrcId) {
if (!net) { if (!net) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic collision, dstId = %u", dstId); 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); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", srcId, dstId);
m_p25->m_rfState = RS_RF_REJECTED; 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); ::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); m_p25->m_affiliations.releaseGrant(dstId, false);
if (!net) { 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; 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); ::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); m_p25->m_affiliations.releaseGrant(dstId, false);
if (!net) { 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; 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 (m_p25->m_rfState != RS_RF_LISTENING && m_p25->m_rfState != RS_RF_DATA) {
if (!net) { if (!net) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) denied, traffic in progress, srcId = %u", srcId); 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; 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.isGranted(srcId)) {
if (!m_p25->m_affiliations.rfCh()->isRFChAvailable()) { if (!m_p25->m_affiliations.rfCh()->isRFChAvailable()) {
if (!net) { if (!net) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) queued, no channels available, srcId = %u", srcId); LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_ISP_SNDCP_CH_REQ (SNDCP Data Channel Request) denied, no channels available, 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_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; m_p25->m_rfState = RS_RF_REJECTED;
} }
@ -2551,8 +2551,9 @@ void ControlSignaling::writeRF_TSDU_ACK_FNE(uint32_t srcId, uint32_t service, bo
/// <param name="dstId"></param> /// <param name="dstId"></param>
/// <param name="reason"></param> /// <param name="reason"></param>
/// <param name="service"></param> /// <param name="service"></param>
/// <param name="grp"></param>
/// <param name="aiv"></param> /// <param name="aiv"></param>
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_DENY_RSP> osp = std::make_unique<OSP_DENY_RSP>(); std::unique_ptr<OSP_DENY_RSP> osp = std::make_unique<OSP_DENY_RSP>();
osp->setAIV(aiv); osp->setAIV(aiv);
@ -2560,6 +2561,7 @@ void ControlSignaling::writeRF_TSDU_Deny(uint32_t srcId, uint32_t dstId, uint8_t
osp->setDstId(dstId); osp->setDstId(dstId);
osp->setService(service); osp->setService(service);
osp->setResponse(reason); osp->setResponse(reason);
osp->setGroup(grp);
if (m_verbose) { if (m_verbose) {
LogMessage(LOG_RF, P25_TSDU_STR ", %s, AIV = %u, reason = $%02X, srcId = %u, dstId = %u", 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)
/// <param name="dstId"></param> /// <param name="dstId"></param>
/// <param name="reason"></param> /// <param name="reason"></param>
/// <param name="service"></param> /// <param name="service"></param>
/// <param name="aiv"></param>
/// <param name="grp"></param> /// <param name="grp"></param>
void ControlSignaling::writeRF_TSDU_Queue(uint32_t srcId, uint32_t dstId, uint8_t reason, uint8_t service, bool aiv, bool grp) /// <param name="aiv"></param>
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_QUE_RSP> osp = std::make_unique<OSP_QUE_RSP>(); std::unique_ptr<OSP_QUE_RSP> osp = std::make_unique<OSP_QUE_RSP>();
osp->setAIV(aiv); osp->setAIV(aiv);

@ -196,7 +196,7 @@ namespace p25
/// <summary>Helper to write a acknowledge packet.</summary> /// <summary>Helper to write a acknowledge packet.</summary>
void writeRF_TSDU_ACK_FNE(uint32_t srcId, uint32_t service, bool extended, bool noActivityLog); void writeRF_TSDU_ACK_FNE(uint32_t srcId, uint32_t service, bool extended, bool noActivityLog);
/// <summary>Helper to write a deny packet.</summary> /// <summary>Helper to write a deny packet.</summary>
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);
/// <summary>Helper to write a group affiliation response packet.</summary> /// <summary>Helper to write a group affiliation response packet.</summary>
bool writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId); bool writeRF_TSDU_Grp_Aff_Rsp(uint32_t srcId, uint32_t dstId);
/// <summary>Helper to write a unit registration response packet.</summary> /// <summary>Helper to write a unit registration response packet.</summary>
@ -204,7 +204,7 @@ namespace p25
/// <summary>Helper to write a unit de-registration acknowledge packet.</summary> /// <summary>Helper to write a unit de-registration acknowledge packet.</summary>
void writeRF_TSDU_U_Dereg_Ack(uint32_t srcId); void writeRF_TSDU_U_Dereg_Ack(uint32_t srcId);
/// <summary>Helper to write a queue packet.</summary> /// <summary>Helper to write a queue packet.</summary>
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);
/// <summary>Helper to write a location registration response packet.</summary> /// <summary>Helper to write a location registration response packet.</summary>
bool writeRF_TSDU_Loc_Reg_Rsp(uint32_t srcId, uint32_t dstId, bool grp); bool writeRF_TSDU_Loc_Reg_Rsp(uint32_t srcId, uint32_t dstId, bool grp);

@ -286,7 +286,7 @@ bool Voice::process(uint8_t* data, uint32_t len)
if (m_lastRejectId == 0U || m_lastRejectId != srcId) { if (m_lastRejectId == 0U || m_lastRejectId != srcId) {
LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId); LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, srcId = %u", srcId);
if (m_p25->m_enableControl) { 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); 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) { if (m_lastRejectId == 0 || m_lastRejectId != dstId) {
LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId); LogWarning(LOG_RF, P25_HDU_STR " denial, RID rejection, dstId = %u", dstId);
if (m_p25->m_enableControl) { 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); ::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) { if (m_lastRejectId == 0 || m_lastRejectId != dstId) {
LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId); LogWarning(LOG_RF, P25_HDU_STR " denial, TGID rejection, dstId = %u", dstId);
if (m_p25->m_enableControl) { 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); ::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_p25->m_affiliations.isGroupAff(srcId, dstId) && m_p25->m_control->m_verifyAff) {
if (m_lastRejectId == 0 || m_lastRejectId != srcId) { 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); 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); 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); ::ActivityLog("P25", true, "RF voice rejection from %u to %s%u ", srcId, group ? "TG " : "", dstId);

Loading…
Cancel
Save

Powered by TurnKey Linux.