From f2de00695406c8d25a6cb7ceebc88a1949de85cc Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Wed, 12 Jul 2023 12:58:42 -0400 Subject: [PATCH] ensure stream IDs are maintained from source peer to destination peer; --- src/network/FNENetwork.cpp | 13 +++++++++---- src/network/FNENetwork.h | 4 ++-- src/network/fne/TagDMRData.cpp | 2 +- src/network/fne/TagNXDNData.cpp | 2 +- src/network/fne/TagP25Data.cpp | 2 +- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/network/FNENetwork.cpp b/src/network/FNENetwork.cpp index 21c904b0..7f6172fb 100644 --- a/src/network/FNENetwork.cpp +++ b/src/network/FNENetwork.cpp @@ -919,12 +919,16 @@ void FNENetwork::writeDeactiveTGIDs() /// Buffer to write to the network. /// Length of buffer to write. /// +/// /// -bool FNENetwork::writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length, uint16_t pktSeq, bool queueOnly) +bool FNENetwork::writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length, uint16_t pktSeq, uint32_t streamId, bool queueOnly) { auto it = std::find_if(m_peers.begin(), m_peers.end(), [&](PeerMapPair x) { return x.first == peerId; }); if (it != m_peers.end()) { - uint32_t streamId = m_peers[peerId].currStreamId(); + uint32_t peerStreamId = m_peers[peerId].currStreamId(); + if (streamId == 0U) { + streamId = peerStreamId; + } sockaddr_storage addr = m_peers[peerId].socketStorage(); uint32_t addrLen = m_peers[peerId].sockStorageLen(); @@ -944,9 +948,10 @@ bool FNENetwork::writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const /// Opcode. /// Buffer to write to the network. /// Length of buffer to write. +/// /// /// -bool FNENetwork::writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length, bool queueOnly, bool incPktSeq) +bool FNENetwork::writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length, uint32_t streamId, bool queueOnly, bool incPktSeq) { auto it = std::find_if(m_peers.begin(), m_peers.end(), [&](PeerMapPair x) { return x.first == peerId; }); if (it != m_peers.end()) { @@ -955,7 +960,7 @@ bool FNENetwork::writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const } uint16_t pktSeq = m_peers[peerId].pktLastSeq(); - return writePeer(peerId, opcode, data, length, pktSeq, queueOnly); + return writePeer(peerId, opcode, data, length, pktSeq, streamId, queueOnly); } return false; diff --git a/src/network/FNENetwork.h b/src/network/FNENetwork.h index 0a3a1a76..a47fcdcf 100644 --- a/src/network/FNENetwork.h +++ b/src/network/FNENetwork.h @@ -258,10 +258,10 @@ namespace network /// Helper to send a raw message to the specified peer. bool writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length, - uint16_t pktSeq, bool queueOnly = false); + uint16_t pktSeq, uint32_t streamId, bool queueOnly = false); /// Helper to send a raw message to the specified peer. bool writePeer(uint32_t peerId, FrameQueue::OpcodePair opcode, const uint8_t* data, uint32_t length, - bool queueOnly = false, bool incPktSeq = false); + uint32_t streamId, bool queueOnly = false, bool incPktSeq = false); /// Helper to send a tagged message to the specified peer. bool writePeerTagged(uint32_t peerId, FrameQueue::OpcodePair opcode, const char* tag, const uint8_t* data = nullptr, uint32_t length = 0U, bool queueOnly = false, bool incPktSeq = false); diff --git a/src/network/fne/TagDMRData.cpp b/src/network/fne/TagDMRData.cpp index 08900d1a..c96f9eed 100644 --- a/src/network/fne/TagDMRData.cpp +++ b/src/network/fne/TagDMRData.cpp @@ -212,7 +212,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId continue; } - m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, data, len, pktSeq, true); + m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_DMR }, data, 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); diff --git a/src/network/fne/TagNXDNData.cpp b/src/network/fne/TagNXDNData.cpp index c34fcbaf..e360cacb 100644 --- a/src/network/fne/TagNXDNData.cpp +++ b/src/network/fne/TagNXDNData.cpp @@ -184,7 +184,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI continue; } - m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, data, len, pktSeq, true); + m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_NXDN }, data, 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); diff --git a/src/network/fne/TagP25Data.cpp b/src/network/fne/TagP25Data.cpp index 36ede8cd..585c12fd 100644 --- a/src/network/fne/TagP25Data.cpp +++ b/src/network/fne/TagP25Data.cpp @@ -223,7 +223,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId continue; } - m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, data, len, pktSeq, true); + m_network->writePeer(peer.first, { NET_FUNC_PROTOCOL, NET_PROTOCOL_SUBFUNC_P25 }, data, 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);