From 91a995af43600a3b05c0f0f3fa453d59848ec531 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 31 Jan 2024 14:48:23 -0500 Subject: [PATCH] correct issue where writeMaster wasn't being properly treated as an immediate (we cannot queue peer master packets like we can master peer packets); fix issue with peer title for affiliation lists; --- src/fne/network/FNENetwork.cpp | 6 +- src/fne/network/fne/TagDMRData.cpp | 92 +++++++++++++++------------- src/fne/network/fne/TagNXDNData.cpp | 92 +++++++++++++++------------- src/fne/network/fne/TagP25Data.cpp | 94 ++++++++++++++++------------- 4 files changed, 157 insertions(+), 127 deletions(-) diff --git a/src/fne/network/FNENetwork.cpp b/src/fne/network/FNENetwork.cpp index 971d9043..b7843c02 100644 --- a/src/fne/network/FNENetwork.cpp +++ b/src/fne/network/FNENetwork.cpp @@ -453,9 +453,9 @@ void FNENetwork::clock(uint32_t ms) } // setup the affiliations list for this peer - std::stringstream peerName; - peerName << "PEER " << peerId; - m_peerAffiliations[peerId] = new lookups::AffiliationLookup(peerName.str().c_str(), m_verbose); + char *peerName = new char[16]; + ::sprintf(peerName, "PEER %u", peerId); + m_peerAffiliations[peerId] = new lookups::AffiliationLookup(peerName, m_verbose); } } } diff --git a/src/fne/network/fne/TagDMRData.cpp b/src/fne/network/fne/TagDMRData.cpp index 0c7748cd..9243d7a9 100644 --- a/src/fne/network/fne/TagDMRData.cpp +++ b/src/fne/network/fne/TagDMRData.cpp @@ -139,22 +139,20 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId m_status.erase(dstId); } else { - return false; - } - - // is this a parrot talkgroup? if so, clear any remaining frames from the buffer - lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); - if (tg.config().parrot()) { - if (m_parrotFrames.size() > 0) { - m_parrotFramesReady = true; - Thread::sleep(m_network->m_parrotDelay); - LogMessage(LOG_NET, "DMR, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + // is this a parrot talkgroup? if so, clear any remaining frames from the buffer + lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); + if (tg.config().parrot()) { + if (m_parrotFrames.size() > 0) { + m_parrotFramesReady = true; + Thread::sleep(m_network->m_parrotDelay); + LogMessage(LOG_NET, "DMR, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + } } - } - LogMessage(LOG_NET, "DMR, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", - peerId, srcId, dstId, duration / 1000, streamId); - m_network->m_callInProgress = false; + LogMessage(LOG_NET, "DMR, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", + peerId, srcId, dstId, duration / 1000, streamId); + m_network->m_callInProgress = false; + } } // is this a new call stream? @@ -206,46 +204,58 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } // repeat traffic to the connected peers - for (auto peer : m_network->m_peers) { - if (peerId != peer.first) { - // is this peer ignored? - if (!isPeerPermitted(peer.first, dmrData, streamId)) { - continue; - } + if (m_network->m_peers.size() > 0U) { + for (auto peer : m_network->m_peers) { + if (peerId != peer.first) { + // is this peer ignored? + if (!isPeerPermitted(peer.first, dmrData, streamId)) { + continue; + } - m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, buffer, len, pktSeq, streamId, true); - if (m_network->m_debug) { - LogDebug(LOG_NET, "DMR, srcPeer = %u, dstPeer = %u, seqNo = %u, srcId = %u, dstId = %u, flco = $%02X, slotNo = %u, len = %u, pktSeq = %u, stream = %u", - peerId, peer.first, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId); - } + m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, buffer, len, pktSeq, streamId, true); + if (m_network->m_debug) { + LogDebug(LOG_NET, "DMR, srcPeer = %u, dstPeer = %u, seqNo = %u, srcId = %u, dstId = %u, flco = $%02X, slotNo = %u, len = %u, pktSeq = %u, stream = %u", + peerId, peer.first, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId); + } - if (!m_network->m_callInProgress) - m_network->m_callInProgress = true; + if (!m_network->m_callInProgress) + m_network->m_callInProgress = true; + } } + m_network->m_frameQueue->flushQueue(); } - m_network->m_frameQueue->flushQueue(); // repeat traffic to upstream peers - if (m_network->m_host->m_peerNetworks.size() > 0 && !tg.config().parrot()) { + if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) { for (auto peer : m_network->m_host->m_peerNetworks) { - uint32_t peerId = peer.second->getPeerId(); + uint32_t dstPeerId = peer.second->getPeerId(); + + // don't try to repeat traffic to the source peer...if this traffic + // is coming from a upstream peer + if (dstPeerId != peerId) { + // is this peer ignored? + if (!isPeerPermitted(dstPeerId, dmrData, streamId)) { + continue; + } - // is this peer ignored? - if (!isPeerPermitted(peerId, dmrData, streamId)) { - continue; - } + uint8_t outboundPeerBuffer[len]; + ::memset(outboundPeerBuffer, 0x00U, len); + ::memcpy(outboundPeerBuffer, buffer, len); - uint8_t outboundPeerBuffer[len]; - ::memset(outboundPeerBuffer, 0x00U, len); - ::memcpy(outboundPeerBuffer, buffer, len); + // perform TGID route rewrites if configured + routeRewrite(outboundPeerBuffer, dstPeerId, dmrData, dataType, dstId, slotNo); - // perform TGID route rewrites if configured - routeRewrite(outboundPeerBuffer, peerId, dmrData, dataType, dstId, slotNo); + peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, outboundPeerBuffer, len, pktSeq, streamId); + if (m_network->m_debug) { + LogDebug(LOG_NET, "DMR, srcPeer = %u, dstPeer = %u, seqNo = %u, srcId = %u, dstId = %u, flco = $%02X, slotNo = %u, len = %u, pktSeq = %u, stream = %u", + peerId, dstPeerId, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId); + } - peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, outboundPeerBuffer, len, pktSeq, streamId, true); + if (!m_network->m_callInProgress) + m_network->m_callInProgress = true; + } } } - m_network->m_frameQueue->flushQueue(); return true; } diff --git a/src/fne/network/fne/TagNXDNData.cpp b/src/fne/network/fne/TagNXDNData.cpp index c961d99e..0adad3f1 100644 --- a/src/fne/network/fne/TagNXDNData.cpp +++ b/src/fne/network/fne/TagNXDNData.cpp @@ -109,22 +109,20 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI m_status.erase(dstId); } else { - return false; - } - - // is this a parrot talkgroup? if so, clear any remaining frames from the buffer - lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); - if (tg.config().parrot()) { - if (m_parrotFrames.size() > 0) { - m_parrotFramesReady = true; - Thread::sleep(m_network->m_parrotDelay); - LogMessage(LOG_NET, "NXDN, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + // is this a parrot talkgroup? if so, clear any remaining frames from the buffer + lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); + if (tg.config().parrot()) { + if (m_parrotFrames.size() > 0) { + m_parrotFramesReady = true; + Thread::sleep(m_network->m_parrotDelay); + LogMessage(LOG_NET, "NXDN, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + } } - } - LogMessage(LOG_NET, "NXDN, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", - peerId, srcId, dstId, duration / 1000, streamId); - m_network->m_callInProgress = false; + LogMessage(LOG_NET, "NXDN, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", + peerId, srcId, dstId, duration / 1000, streamId); + m_network->m_callInProgress = false; + } } // is this a new call stream? @@ -176,46 +174,58 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI } // repeat traffic to the connected peers - for (auto peer : m_network->m_peers) { - if (peerId != peer.first) { - // is this peer ignored? - if (!isPeerPermitted(peer.first, lc, messageType, streamId)) { - continue; - } + if (m_network->m_peers.size() > 0U) { + for (auto peer : m_network->m_peers) { + if (peerId != peer.first) { + // is this peer ignored? + if (!isPeerPermitted(peer.first, lc, messageType, streamId)) { + continue; + } - m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, buffer, len, pktSeq, streamId, true); - if (m_network->m_debug) { - LogDebug(LOG_NET, "NXDN, srcPeer = %u, dstPeer = %u, messageType = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", - peerId, peer.first, messageType, srcId, dstId, len, pktSeq, streamId); - } + m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, buffer, len, pktSeq, streamId, true); + if (m_network->m_debug) { + LogDebug(LOG_NET, "NXDN, srcPeer = %u, dstPeer = %u, messageType = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", + peerId, peer.first, messageType, srcId, dstId, len, pktSeq, streamId); + } - if (!m_network->m_callInProgress) - m_network->m_callInProgress = true; + if (!m_network->m_callInProgress) + m_network->m_callInProgress = true; + } } + m_network->m_frameQueue->flushQueue(); } - m_network->m_frameQueue->flushQueue(); // repeat traffic to upstream peers - if (m_network->m_host->m_peerNetworks.size() > 0 && !tg.config().parrot()) { + if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) { for (auto peer : m_network->m_host->m_peerNetworks) { - uint32_t peerId = peer.second->getPeerId(); + uint32_t dstPeerId = peer.second->getPeerId(); + + // don't try to repeat traffic to the source peer...if this traffic + // is coming from a upstream peer + if (dstPeerId != peerId) { + // is this peer ignored? + if (!isPeerPermitted(dstPeerId, lc, messageType, streamId)) { + continue; + } - // is this peer ignored? - if (!isPeerPermitted(peerId, lc, messageType, streamId)) { - continue; - } + uint8_t outboundPeerBuffer[len]; + ::memset(outboundPeerBuffer, 0x00U, len); + ::memcpy(outboundPeerBuffer, buffer, len); - uint8_t outboundPeerBuffer[len]; - ::memset(outboundPeerBuffer, 0x00U, len); - ::memcpy(outboundPeerBuffer, buffer, len); + // perform TGID route rewrites if configured + routeRewrite(outboundPeerBuffer, dstPeerId, messageType, dstId); - // perform TGID route rewrites if configured - routeRewrite(outboundPeerBuffer, peerId, messageType, dstId); + peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, outboundPeerBuffer, len, pktSeq, streamId); + if (m_network->m_debug) { + LogDebug(LOG_NET, "NXDN, srcPeer = %u, dstPeer = %u, messageType = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", + peerId, dstPeerId, messageType, srcId, dstId, len, pktSeq, streamId); + } - peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, outboundPeerBuffer, len, pktSeq, streamId, true); + if (!m_network->m_callInProgress) + m_network->m_callInProgress = true; + } } } - m_network->m_frameQueue->flushQueue(); return true; } diff --git a/src/fne/network/fne/TagP25Data.cpp b/src/fne/network/fne/TagP25Data.cpp index 71801975..963b6b9b 100644 --- a/src/fne/network/fne/TagP25Data.cpp +++ b/src/fne/network/fne/TagP25Data.cpp @@ -151,23 +151,21 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId m_status.erase(dstId); } else { - return false; - } - - // is this a parrot talkgroup? if so, clear any remaining frames from the buffer - lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); - if (tg.config().parrot()) { - if (m_parrotFrames.size() > 0) { - m_parrotFramesReady = true; - m_parrotFirstFrame = true; - Thread::sleep(m_network->m_parrotDelay); - LogMessage(LOG_NET, "P25, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + // is this a parrot talkgroup? if so, clear any remaining frames from the buffer + lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); + if (tg.config().parrot()) { + if (m_parrotFrames.size() > 0) { + m_parrotFramesReady = true; + m_parrotFirstFrame = true; + Thread::sleep(m_network->m_parrotDelay); + LogMessage(LOG_NET, "P25, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId); + } } - } - LogMessage(LOG_NET, "P25, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", - peerId, srcId, dstId, duration / 1000, streamId); - m_network->m_callInProgress = false; + LogMessage(LOG_NET, "P25, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u", + peerId, srcId, dstId, duration / 1000, streamId); + m_network->m_callInProgress = false; + } } // is this a new call stream? @@ -219,46 +217,58 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId } // repeat traffic to the connected peers - for (auto peer : m_network->m_peers) { - if (peerId != peer.first) { - // is this peer ignored? - if (!isPeerPermitted(peer.first, control, duid, streamId)) { - continue; - } + if (m_network->m_peers.size() > 0U) { + for (auto peer : m_network->m_peers) { + if (peerId != peer.first) { + // is this peer ignored? + if (!isPeerPermitted(peer.first, control, duid, streamId)) { + continue; + } - m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, buffer, len, pktSeq, streamId, true); - if (m_network->m_debug) { - LogDebug(LOG_NET, "P25, srcPeer = %u, dstPeer = %u, duid = $%02X, lco = $%02X, MFId = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", - peerId, peer.first, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId); - } + m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, buffer, len, pktSeq, streamId, true); + if (m_network->m_debug) { + LogDebug(LOG_NET, "P25, srcPeer = %u, dstPeer = %u, duid = $%02X, lco = $%02X, MFId = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", + peerId, peer.first, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId); + } - if (!m_network->m_callInProgress) - m_network->m_callInProgress = true; + if (!m_network->m_callInProgress) + m_network->m_callInProgress = true; + } } + m_network->m_frameQueue->flushQueue(); } - m_network->m_frameQueue->flushQueue(); // repeat traffic to upstream peers - if (m_network->m_host->m_peerNetworks.size() > 0 && !tg.config().parrot()) { + if (m_network->m_host->m_peerNetworks.size() > 0U && !tg.config().parrot()) { for (auto peer : m_network->m_host->m_peerNetworks) { - uint32_t peerId = peer.second->getPeerId(); + uint32_t dstPeerId = peer.second->getPeerId(); + + // don't try to repeat traffic to the source peer...if this traffic + // is coming from a upstream peer + if (dstPeerId != peerId) { + // is this peer ignored? + if (!isPeerPermitted(dstPeerId, control, duid, streamId)) { + continue; + } - // is this peer ignored? - if (!isPeerPermitted(peerId, control, duid, streamId)) { - continue; - } + uint8_t outboundPeerBuffer[len]; + ::memset(outboundPeerBuffer, 0x00U, len); + ::memcpy(outboundPeerBuffer, buffer, len); - uint8_t outboundPeerBuffer[len]; - ::memset(outboundPeerBuffer, 0x00U, len); - ::memcpy(outboundPeerBuffer, buffer, len); + // perform TGID route rewrites if configured + routeRewrite(outboundPeerBuffer, dstPeerId, duid, dstId); - // perform TGID route rewrites if configured - routeRewrite(outboundPeerBuffer, peerId, duid, dstId); + peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, outboundPeerBuffer, len, pktSeq, streamId); + if (m_network->m_debug) { + LogDebug(LOG_NET, "P25, srcPeer = %u, dstPeer = %u, duid = $%02X, lco = $%02X, MFId = $%02X, srcId = %u, dstId = %u, len = %u, pktSeq = %u, streamId = %u", + peerId, dstPeerId, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId); + } - peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, outboundPeerBuffer, len, pktSeq, streamId, true); + if (!m_network->m_callInProgress) + m_network->m_callInProgress = true; + } } } - m_network->m_frameQueue->flushQueue(); return true; }