correct some issues with software voting in conditions where two RF sites overlap;

pull/1/head
Bryan Biedenkapp 5 years ago
parent 024a28f0a3
commit 5ec7330423

@ -198,10 +198,20 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
// stop network frames from processing -- RF wants to transmit on a different talkgroup // stop network frames from processing -- RF wants to transmit on a different talkgroup
if (m_p25->m_netState != RS_NET_IDLE) { if (m_p25->m_netState != RS_NET_IDLE) {
LogWarning(LOG_RF, "Traffic collision detect, preempting existing network traffic to new RF traffic, rfDstId = %u, netDstId = %u", m_rfLC.getDstId(), if (m_netLC.getSrcId() == srcId && m_netLC.getDstId() == dstId) {
m_p25->m_netLastDstId); LogWarning(LOG_RF, "Traffic collision detect, preempting new RF traffic to existing RF traffic (Are we in a voting condition?), rfSrcId = %u, rfDstId = %u, netSrcId = %u, netDstId = %u", m_rfLC.getSrcId(), m_rfLC.getDstId(),
resetNet(); srcId, dstId);
m_p25->writeRF_TDU(true); resetRF();
return false;
}
else {
LogWarning(LOG_RF, "Traffic collision detect, preempting existing network traffic to new RF traffic, rfDstId = %u, netDstId = %u", m_rfLC.getDstId(),
m_p25->m_netLastDstId);
resetNet();
/*
m_p25->writeRF_TDU(true);
*/
}
} }
m_p25->m_trunk->setRFLC(m_rfLC); m_p25->m_trunk->setRFLC(m_rfLC);
@ -607,13 +617,6 @@ bool VoicePacket::process(uint8_t* data, uint32_t len)
/// <returns></returns> /// <returns></returns>
bool VoicePacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid) bool VoicePacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid)
{ {
// don't process network frames if the RF modem isn't in a listening state
if (m_p25->m_rfState != RS_RF_LISTENING) {
LogWarning(LOG_NET, "Traffic collision detect, preempting new network traffic to existing RF traffic!");
resetNet();
return false;
}
uint32_t count = 0U; uint32_t count = 0U;
switch (duid) { switch (duid) {
@ -729,10 +732,6 @@ bool VoicePacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, d
m_p25->m_trunk->resetRF(); m_p25->m_trunk->resetRF();
m_p25->m_trunk->resetNet(); m_p25->m_trunk->resetNet();
if (!m_p25->m_ccRunning) {
m_p25->m_trunk->writeRF_ControlData(255U, 0U, false);
}
writeNet_HDU(control, lsd); writeNet_HDU(control, lsd);
if (m_p25->m_netState != RS_NET_IDLE) { if (m_p25->m_netState != RS_NET_IDLE) {
writeNet_LDU1(control, lsd); writeNet_LDU1(control, lsd);
@ -749,6 +748,12 @@ bool VoicePacket::processNetwork(uint8_t* data, uint32_t len, lc::LC& control, d
break; break;
case P25_DUID_TDU: case P25_DUID_TDU:
case P25_DUID_TDULC: case P25_DUID_TDULC:
// don't process network frames if the RF modem isn't in a listening state
if (m_p25->m_rfState != RS_RF_LISTENING) {
resetNet();
return false;
}
if (m_p25->m_control) { if (m_p25->m_control) {
m_p25->m_trunk->releaseDstIdGrant(m_netLC.getDstId(), false); m_p25->m_trunk->releaseDstIdGrant(m_netLC.getDstId(), false);
} }
@ -955,6 +960,22 @@ void VoicePacket::writeNet_HDU(const lc::LC& control, const data::LowSpeedData&
LogWarning(LOG_NET, P25_HDU_STR ", last LDU1 LC has bad data, srcId = 0"); LogWarning(LOG_NET, P25_HDU_STR ", last LDU1 LC has bad data, srcId = 0");
} }
// don't process network frames if the RF modem isn't in a listening state
if (m_p25->m_rfState != RS_RF_LISTENING) {
if (m_rfLC.getSrcId() == srcId && m_rfLC.getDstId() == dstId) {
LogWarning(LOG_RF, "Traffic collision detect, preempting new network traffic to existing RF traffic (Are we in a voting condition?), rfSrcId = %u, rfDstId = %u, netSrcId = %u, netDstId = %u", m_rfLC.getSrcId(), m_rfLC.getDstId(),
srcId, dstId);
resetNet();
return;
}
else {
LogWarning(LOG_RF, "Traffic collision detect, preempting new network traffic to existing RF traffic, rfDstId = %u, netDstId = %u", m_rfLC.getDstId(),
dstId);
resetNet();
return;
}
}
uint8_t algId = m_netLDU2[126U]; uint8_t algId = m_netLDU2[126U];
uint32_t kId = (m_netLDU2[127U] << 8) + m_netLDU2[128U]; uint32_t kId = (m_netLDU2[127U] << 8) + m_netLDU2[128U];
bool group = control.getLCO() == LC_GROUP; bool group = control.getLCO() == LC_GROUP;
@ -1003,6 +1024,10 @@ void VoicePacket::writeNet_HDU(const lc::LC& control, const data::LowSpeedData&
} }
} }
if (!m_p25->m_ccRunning) {
m_p25->m_trunk->writeRF_ControlData(255U, 0U, false);
}
::ActivityLog("P25", false, "received network transmission from %u to %s%u", srcId, group ? "TG " : "", dstId); ::ActivityLog("P25", false, "received network transmission from %u to %s%u", srcId, group ? "TG " : "", dstId);
m_rfLC.reset(); m_rfLC.reset();

Loading…
Cancel
Save

Powered by TurnKey Linux.