fix incorrect handling of GRP_VH_REQ during a network voice call;

pull/1/head
Bryan Biedenkapp 5 years ago
parent 3c8d747538
commit 3375748224

@ -337,7 +337,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request), srcId = %u, dstId = %u", srcId, dstId); LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request), srcId = %u, dstId = %u", srcId, dstId);
} }
writeRF_TSDU_Grant(true, false); writeRF_TSDU_Grant(true, false, false);
break; break;
case TSBK_IOSP_UU_VCH: case TSBK_IOSP_UU_VCH:
// make sure control data is supported // make sure control data is supported
@ -378,7 +378,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len)
} }
if (m_rfTSBK.getResponse() == P25_ANS_RSP_PROCEED) { if (m_rfTSBK.getResponse() == P25_ANS_RSP_PROCEED) {
writeRF_TSDU_Grant(false, false); writeRF_TSDU_Grant(false, false, false);
} }
else if (m_rfTSBK.getResponse() == P25_ANS_RSP_DENY) { else if (m_rfTSBK.getResponse() == P25_ANS_RSP_DENY) {
writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_REFUSED, TSBK_IOSP_UU_ANS); writeRF_TSDU_Deny(P25_DENY_RSN_TGT_UNIT_REFUSED, TSBK_IOSP_UU_ANS);
@ -1928,8 +1928,9 @@ void TrunkPacket::queueRF_TSBK_Ctrl_MBF(uint8_t lco)
/// </summary> /// </summary>
/// <param name="grp"></param> /// <param name="grp"></param>
/// <param name="skip"></param> /// <param name="skip"></param>
/// <param name="net"></param>
/// <returns></returns> /// <returns></returns>
bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip) bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip, bool net)
{ {
uint8_t lco = m_rfTSBK.getLCO(); uint8_t lco = m_rfTSBK.getLCO();
@ -1940,22 +1941,26 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip)
// are we skipping checking? // are we skipping checking?
if (!skip) { if (!skip) {
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) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", m_rfTSBK.getDstId()); if (!net) {
writeRF_TSDU_Deny(P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", m_rfTSBK.getDstId());
writeRF_TSDU_Deny(P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH);
::ActivityLog("P25", true, "group grant request from %u to TG %u denied", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId());
m_p25->m_rfState = RS_RF_REJECTED; m_p25->m_rfState = RS_RF_REJECTED;
}
m_rfTSBK.setLCO(lco); m_rfTSBK.setLCO(lco);
return false; return false;
} }
if (m_p25->m_netState != RS_NET_IDLE && m_rfTSBK.getDstId() == m_p25->m_netLastDstId) { if (m_p25->m_netState != RS_NET_IDLE && m_rfTSBK.getDstId() == m_p25->m_netLastDstId) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", m_rfTSBK.getDstId()); if (!net) {
writeRF_TSDU_Deny(P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) denied, traffic in progress, dstId = %u", m_rfTSBK.getDstId());
writeRF_TSDU_Deny(P25_DENY_RSN_PTT_COLLIDE, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH);
::ActivityLog("P25", true, "group grant request from %u to TG %u denied", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); ::ActivityLog("P25", true, "group grant request from %u to TG %u denied", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId());
m_p25->m_rfState = RS_RF_REJECTED; m_p25->m_rfState = RS_RF_REJECTED;
}
m_rfTSBK.setLCO(lco); m_rfTSBK.setLCO(lco);
return false; return false;
@ -1964,8 +1969,11 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip)
// don't transmit grants if the destination ID's don't match and the network TG hang timer is running // don't transmit grants if the destination ID's don't match and the network TG hang timer is running
if (m_p25->m_rfLastDstId != 0U) { if (m_p25->m_rfLastDstId != 0U) {
if (m_p25->m_rfLastDstId != m_rfTSBK.getDstId() && (m_p25->m_rfTGHang.isRunning() && !m_p25->m_rfTGHang.hasExpired())) { if (m_p25->m_rfLastDstId != m_rfTSBK.getDstId() && (m_p25->m_rfTGHang.isRunning() && !m_p25->m_rfTGHang.hasExpired())) {
writeRF_TSDU_Deny(P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH); if (!net) {
m_p25->m_rfState = RS_RF_REJECTED; writeRF_TSDU_Deny(P25_DENY_RSN_PTT_BONK, (grp) ? TSBK_IOSP_GRP_VCH : TSBK_IOSP_UU_VCH);
m_p25->m_rfState = RS_RF_REJECTED;
}
m_rfTSBK.setLCO(lco); m_rfTSBK.setLCO(lco);
return false; return false;
} }
@ -1974,21 +1982,25 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip)
if (!hasDstIdGranted(m_rfTSBK.getDstId())) { if (!hasDstIdGranted(m_rfTSBK.getDstId())) {
if (m_voiceChTable.empty()) { if (m_voiceChTable.empty()) {
if (grp) { if (grp) {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Request) queued, no channels available, dstId = %u", m_rfTSBK.getDstId()); if (!net) {
writeRF_TSDU_Queue(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) queued, no channels available, dstId = %u", m_rfTSBK.getDstId());
writeRF_TSDU_Queue(P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_IOSP_GRP_VCH);
::ActivityLog("P25", true, "group grant request from %u to TG %u queued", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); ::ActivityLog("P25", true, "group grant request from %u to TG %u queued", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId());
m_p25->m_rfState = RS_RF_REJECTED; m_p25->m_rfState = RS_RF_REJECTED;
}
m_rfTSBK.setLCO(lco); m_rfTSBK.setLCO(lco);
return false; return false;
} }
else { else {
LogWarning(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Request) queued, no channels available, dstId = %u", m_rfTSBK.getDstId()); if (!net) {
writeRF_TSDU_Queue(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) queued, no channels available, dstId = %u", m_rfTSBK.getDstId());
writeRF_TSDU_Queue(P25_QUE_RSN_CHN_RESOURCE_NOT_AVAIL, TSBK_IOSP_UU_VCH);
::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u queued", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); ::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u queued", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId());
m_p25->m_rfState = RS_RF_REJECTED; m_p25->m_rfState = RS_RF_REJECTED;
}
m_rfTSBK.setLCO(lco); m_rfTSBK.setLCO(lco);
return false; return false;
@ -2018,7 +2030,9 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip)
} }
if (grp) { if (grp) {
::ActivityLog("P25", true, "group grant request from %u to TG %u", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); if (!net) {
::ActivityLog("P25", true, "group grant request from %u to TG %u", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId());
}
if (m_verbose) { if (m_verbose) {
LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Grant), emerg = %u, encrypt = %u, prio = %u, chNo = %u, srcId = %u, dstId = %u", LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_GRP_VCH (Group Voice Channel Grant), emerg = %u, encrypt = %u, prio = %u, chNo = %u, srcId = %u, dstId = %u",
@ -2030,7 +2044,9 @@ bool TrunkPacket::writeRF_TSDU_Grant(bool grp, bool skip)
writeRF_TSDU_SBF(true, true); writeRF_TSDU_SBF(true, true);
} }
else { else {
::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId()); if (!net) {
::ActivityLog("P25", true, "unit-to-unit grant request from %u to %u", m_rfTSBK.getSrcId(), m_rfTSBK.getDstId());
}
if (m_verbose) { if (m_verbose) {
LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Grant), emerg = %u, encrypt = %u, prio = %u, chNo = %u, srcId = %u, dstId = %u", LogMessage(LOG_RF, P25_TSDU_STR ", TSBK_IOSP_UU_VCH (Unit-to-Unit Voice Channel Grant), emerg = %u, encrypt = %u, prio = %u, chNo = %u, srcId = %u, dstId = %u",

@ -213,11 +213,11 @@ namespace p25
void queueRF_TSBK_Ctrl_MBF(uint8_t lco); void queueRF_TSBK_Ctrl_MBF(uint8_t lco);
/// <summary>Helper to write a grant packet.</summary> /// <summary>Helper to write a grant packet.</summary>
bool writeRF_TSDU_Grant(bool grp, bool skip); bool writeRF_TSDU_Grant(bool grp, bool skip, bool net);
/// <summary>Helper to write a unit to unit answer request packet.</summary> /// <summary>Helper to write a unit to unit answer request packet.</summary>
void writeRF_TSDU_UU_Ans_Req(uint32_t srcId, uint32_t dstId); void writeRF_TSDU_UU_Ans_Req(uint32_t srcId, uint32_t dstId);
/// <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 noNetwork); 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(uint8_t reason, uint8_t service); void writeRF_TSDU_Deny(uint8_t reason, uint8_t service);
/// <summary>Helper to write a group affiliation response packet.</summary> /// <summary>Helper to write a group affiliation response packet.</summary>

@ -316,7 +316,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
} }
} }
if (!m_p25->m_trunk->writeRF_TSDU_Grant(m_rfLC.getGroup(), false)) { if (!m_p25->m_trunk->writeRF_TSDU_Grant(m_rfLC.getGroup(), false, false)) {
return false; return false;
} }
} }
@ -329,7 +329,7 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
// single-channel trunking or voice on control support? // single-channel trunking or voice on control support?
if (m_p25->m_control && m_p25->m_voiceOnControl) { if (m_p25->m_control && m_p25->m_voiceOnControl) {
m_p25->m_ccRunning = false; // otherwise the grant will be bundled with other packets m_p25->m_ccRunning = false; // otherwise the grant will be bundled with other packets
m_p25->m_trunk->writeRF_TSDU_Grant(m_rfLC.getGroup(), true); m_p25->m_trunk->writeRF_TSDU_Grant(m_rfLC.getGroup(), true, false);
} }
m_p25->m_trunk->writeRF_TDULC_ChanGrant(m_rfLC.getGroup(), srcId, dstId); m_p25->m_trunk->writeRF_TDULC_ChanGrant(m_rfLC.getGroup(), srcId, dstId);
@ -1104,7 +1104,7 @@ void VoicePacket::writeNet_HDU(const lc::LC& control, const data::LowSpeedData&
m_lastPatchGroup = dstId; m_lastPatchGroup = dstId;
} }
if (!m_p25->m_trunk->writeRF_TSDU_Grant(group, false)) { if (!m_p25->m_trunk->writeRF_TSDU_Grant(group, false, true)) {
if (m_network != NULL) if (m_network != NULL)
m_network->resetP25(); m_network->resetP25();
@ -1127,7 +1127,7 @@ void VoicePacket::writeNet_HDU(const lc::LC& control, const data::LowSpeedData&
// single-channel trunking or voice on control support? // single-channel trunking or voice on control support?
if (m_p25->m_control && m_p25->m_voiceOnControl) { if (m_p25->m_control && m_p25->m_voiceOnControl) {
m_p25->m_ccRunning = false; // otherwise the grant will be bundled with other packets m_p25->m_ccRunning = false; // otherwise the grant will be bundled with other packets
m_p25->m_trunk->writeRF_TSDU_Grant(m_rfLC.getGroup(), true); m_p25->m_trunk->writeRF_TSDU_Grant(m_rfLC.getGroup(), true, true);
} }
m_p25->m_trunk->writeRF_TDULC_ChanGrant(group, srcId, dstId); m_p25->m_trunk->writeRF_TDULC_ChanGrant(group, srcId, dstId);

Loading…
Cancel
Save

Powered by TurnKey Linux.