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;

pull/48/head
Bryan Biedenkapp 2 years ago
parent 7d1c233875
commit 91a995af43

@ -453,9 +453,9 @@ void FNENetwork::clock(uint32_t ms)
} }
// setup the affiliations list for this peer // setup the affiliations list for this peer
std::stringstream peerName; char *peerName = new char[16];
peerName << "PEER " << peerId; ::sprintf(peerName, "PEER %u", peerId);
m_peerAffiliations[peerId] = new lookups::AffiliationLookup(peerName.str().c_str(), m_verbose); m_peerAffiliations[peerId] = new lookups::AffiliationLookup(peerName, m_verbose);
} }
} }
} }

@ -139,22 +139,20 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
m_status.erase(dstId); m_status.erase(dstId);
} }
else { 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()) {
// is this a parrot talkgroup? if so, clear any remaining frames from the buffer if (m_parrotFrames.size() > 0) {
lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); m_parrotFramesReady = true;
if (tg.config().parrot()) { Thread::sleep(m_network->m_parrotDelay);
if (m_parrotFrames.size() > 0) { LogMessage(LOG_NET, "DMR, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId);
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", LogMessage(LOG_NET, "DMR, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u",
peerId, srcId, dstId, duration / 1000, streamId); peerId, srcId, dstId, duration / 1000, streamId);
m_network->m_callInProgress = false; m_network->m_callInProgress = false;
}
} }
// is this a new call stream? // 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 // repeat traffic to the connected peers
for (auto peer : m_network->m_peers) { if (m_network->m_peers.size() > 0U) {
if (peerId != peer.first) { for (auto peer : m_network->m_peers) {
// is this peer ignored? if (peerId != peer.first) {
if (!isPeerPermitted(peer.first, dmrData, streamId)) { // is this peer ignored?
continue; if (!isPeerPermitted(peer.first, dmrData, streamId)) {
} continue;
}
m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, buffer, len, pktSeq, streamId, true); m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, buffer, len, pktSeq, streamId, true);
if (m_network->m_debug) { 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", 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); peerId, peer.first, seqNo, srcId, dstId, flco, slotNo, len, pktSeq, streamId);
} }
if (!m_network->m_callInProgress) if (!m_network->m_callInProgress)
m_network->m_callInProgress = true; m_network->m_callInProgress = true;
}
} }
m_network->m_frameQueue->flushQueue();
} }
m_network->m_frameQueue->flushQueue();
// repeat traffic to upstream peers // 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) { 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? uint8_t outboundPeerBuffer[len];
if (!isPeerPermitted(peerId, dmrData, streamId)) { ::memset(outboundPeerBuffer, 0x00U, len);
continue; ::memcpy(outboundPeerBuffer, buffer, len);
}
uint8_t outboundPeerBuffer[len]; // perform TGID route rewrites if configured
::memset(outboundPeerBuffer, 0x00U, len); routeRewrite(outboundPeerBuffer, dstPeerId, dmrData, dataType, dstId, slotNo);
::memcpy(outboundPeerBuffer, buffer, len);
// perform TGID route rewrites if configured peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, outboundPeerBuffer, len, pktSeq, streamId);
routeRewrite(outboundPeerBuffer, peerId, dmrData, dataType, dstId, slotNo); 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; return true;
} }

@ -109,22 +109,20 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI
m_status.erase(dstId); m_status.erase(dstId);
} }
else { 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()) {
// is this a parrot talkgroup? if so, clear any remaining frames from the buffer if (m_parrotFrames.size() > 0) {
lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); m_parrotFramesReady = true;
if (tg.config().parrot()) { Thread::sleep(m_network->m_parrotDelay);
if (m_parrotFrames.size() > 0) { LogMessage(LOG_NET, "NXDN, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId);
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", LogMessage(LOG_NET, "NXDN, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u",
peerId, srcId, dstId, duration / 1000, streamId); peerId, srcId, dstId, duration / 1000, streamId);
m_network->m_callInProgress = false; m_network->m_callInProgress = false;
}
} }
// is this a new call stream? // 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 // repeat traffic to the connected peers
for (auto peer : m_network->m_peers) { if (m_network->m_peers.size() > 0U) {
if (peerId != peer.first) { for (auto peer : m_network->m_peers) {
// is this peer ignored? if (peerId != peer.first) {
if (!isPeerPermitted(peer.first, lc, messageType, streamId)) { // is this peer ignored?
continue; 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); m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, buffer, len, pktSeq, streamId, true);
if (m_network->m_debug) { 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", 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); peerId, peer.first, messageType, srcId, dstId, len, pktSeq, streamId);
} }
if (!m_network->m_callInProgress) if (!m_network->m_callInProgress)
m_network->m_callInProgress = true; m_network->m_callInProgress = true;
}
} }
m_network->m_frameQueue->flushQueue();
} }
m_network->m_frameQueue->flushQueue();
// repeat traffic to upstream peers // 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) { 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? uint8_t outboundPeerBuffer[len];
if (!isPeerPermitted(peerId, lc, messageType, streamId)) { ::memset(outboundPeerBuffer, 0x00U, len);
continue; ::memcpy(outboundPeerBuffer, buffer, len);
}
uint8_t outboundPeerBuffer[len]; // perform TGID route rewrites if configured
::memset(outboundPeerBuffer, 0x00U, len); routeRewrite(outboundPeerBuffer, dstPeerId, messageType, dstId);
::memcpy(outboundPeerBuffer, buffer, len);
// perform TGID route rewrites if configured peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, outboundPeerBuffer, len, pktSeq, streamId);
routeRewrite(outboundPeerBuffer, peerId, messageType, dstId); 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; return true;
} }

@ -151,23 +151,21 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId
m_status.erase(dstId); m_status.erase(dstId);
} }
else { 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()) {
// is this a parrot talkgroup? if so, clear any remaining frames from the buffer if (m_parrotFrames.size() > 0) {
lookups::TalkgroupRuleGroupVoice tg = m_network->m_tidLookup->find(dstId); m_parrotFramesReady = true;
if (tg.config().parrot()) { m_parrotFirstFrame = true;
if (m_parrotFrames.size() > 0) { Thread::sleep(m_network->m_parrotDelay);
m_parrotFramesReady = true; LogMessage(LOG_NET, "P25, Parrot Playback will Start, peer = %u, srcId = %u", peerId, srcId);
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", LogMessage(LOG_NET, "P25, Call End, peer = %u, srcId = %u, dstId = %u, duration = %u, streamId = %u",
peerId, srcId, dstId, duration / 1000, streamId); peerId, srcId, dstId, duration / 1000, streamId);
m_network->m_callInProgress = false; m_network->m_callInProgress = false;
}
} }
// is this a new call stream? // 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 // repeat traffic to the connected peers
for (auto peer : m_network->m_peers) { if (m_network->m_peers.size() > 0U) {
if (peerId != peer.first) { for (auto peer : m_network->m_peers) {
// is this peer ignored? if (peerId != peer.first) {
if (!isPeerPermitted(peer.first, control, duid, streamId)) { // is this peer ignored?
continue; 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); m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, buffer, len, pktSeq, streamId, true);
if (m_network->m_debug) { 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", 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); peerId, peer.first, duid, lco, MFId, srcId, dstId, len, pktSeq, streamId);
} }
if (!m_network->m_callInProgress) if (!m_network->m_callInProgress)
m_network->m_callInProgress = true; m_network->m_callInProgress = true;
}
} }
m_network->m_frameQueue->flushQueue();
} }
m_network->m_frameQueue->flushQueue();
// repeat traffic to upstream peers // 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) { 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? uint8_t outboundPeerBuffer[len];
if (!isPeerPermitted(peerId, control, duid, streamId)) { ::memset(outboundPeerBuffer, 0x00U, len);
continue; ::memcpy(outboundPeerBuffer, buffer, len);
}
uint8_t outboundPeerBuffer[len]; // perform TGID route rewrites if configured
::memset(outboundPeerBuffer, 0x00U, len); routeRewrite(outboundPeerBuffer, dstPeerId, duid, dstId);
::memcpy(outboundPeerBuffer, buffer, len);
// perform TGID route rewrites if configured peer.second->writeMaster({ NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, outboundPeerBuffer, len, pktSeq, streamId);
routeRewrite(outboundPeerBuffer, peerId, duid, dstId); 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; return true;
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.