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
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);
}
}
}

@ -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;
}

@ -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;
}

@ -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;
}

Loading…
Cancel
Save

Powered by TurnKey Linux.