From a4d6857922d16404f80efcc64cf80d64ec827fa0 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 11 Dec 2023 11:07:57 -0500 Subject: [PATCH] even tho the timestamp field is not used by DVM, lets ensure we roll the timestamp so the difference calculation never results in a rollover; --- src/network/FNENetwork.cpp | 6 ++++++ src/network/FNENetwork.h | 2 ++ src/network/Network.cpp | 7 +++++++ src/network/RTPHeader.cpp | 8 ++++++++ src/network/RTPHeader.h | 3 +++ src/network/fne/TagDMRData.cpp | 5 +++++ src/network/fne/TagNXDNData.cpp | 5 +++++ src/network/fne/TagP25Data.cpp | 5 +++++ 8 files changed, 41 insertions(+) diff --git a/src/network/FNENetwork.cpp b/src/network/FNENetwork.cpp index 74579b51..c6cd0f91 100644 --- a/src/network/FNENetwork.cpp +++ b/src/network/FNENetwork.cpp @@ -89,6 +89,7 @@ FNENetwork::FNENetwork(HostFNE* host, const std::string& address, uint16_t port, m_peers(), m_maintainenceTimer(1000U, pingTime), m_updateLookupTimer(1000U, (updateLookupTime * 60U)), + m_callInProgress(false), m_verbose(verbose) { assert(host != nullptr); @@ -156,6 +157,11 @@ void FNENetwork::clock(uint32_t ms) m_peers.erase(peerId); } + // roll the RTP timestamp if no call is in progress + if (!m_callInProgress) { + frame::RTPHeader::resetStartTime(); + } + m_maintainenceTimer.start(); } diff --git a/src/network/FNENetwork.h b/src/network/FNENetwork.h index 080db6b2..6dfd1cf3 100644 --- a/src/network/FNENetwork.h +++ b/src/network/FNENetwork.h @@ -237,6 +237,8 @@ namespace network Timer m_maintainenceTimer; Timer m_updateLookupTimer; + bool m_callInProgress; + bool m_verbose; /// Helper to send the list of whitelisted RIDs to the specified peer. diff --git a/src/network/Network.cpp b/src/network/Network.cpp index 3e549e19..47cf1efb 100644 --- a/src/network/Network.cpp +++ b/src/network/Network.cpp @@ -248,6 +248,13 @@ void Network::clock(uint32_t ms) return; } + // roll the RTP timestamp if no call is in progress + if ((m_status == NET_STAT_RUNNING) && + (m_rxDMRStreamId[0U] == 0U && m_rxDMRStreamId[1U] == 0U) && + m_rxP25StreamId == 0U && m_rxNXDNStreamId == 0U) { + frame::RTPHeader::resetStartTime(); + } + sockaddr_storage address; uint32_t addrLen; diff --git a/src/network/RTPHeader.cpp b/src/network/RTPHeader.cpp index bc7fda86..a02aa03a 100644 --- a/src/network/RTPHeader.cpp +++ b/src/network/RTPHeader.cpp @@ -119,3 +119,11 @@ void RTPHeader::encode(uint8_t* data) __SET_UINT32(m_timestamp, data, 4U); // Timestamp __SET_UINT32(m_ssrc, data, 8U); // Synchronization Source Identifier } + +/// +/// Helper to reset the start timestamp. +/// +void RTPHeader::resetStartTime() +{ + m_wcStart = hrc::hrc_t(); +} diff --git a/src/network/RTPHeader.h b/src/network/RTPHeader.h index ddf7c706..072ea14b 100644 --- a/src/network/RTPHeader.h +++ b/src/network/RTPHeader.h @@ -62,6 +62,9 @@ namespace network /// Encode a RTP header. virtual void encode(uint8_t* data); + /// Helper to reset the start timestamp. + static void resetStartTime(); + public: /// RTP Protocol Version. __READONLY_PROPERTY(uint8_t, version, Version); diff --git a/src/network/fne/TagDMRData.cpp b/src/network/fne/TagDMRData.cpp index eb02b045..8bfe3e49 100644 --- a/src/network/fne/TagDMRData.cpp +++ b/src/network/fne/TagDMRData.cpp @@ -156,6 +156,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId 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? @@ -194,6 +195,7 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId status.streamId = streamId; m_status[dstId] = status; // this *could* be an issue if a dstId appears on both slots somehow... LogMessage(LOG_NET, "DMR, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); + m_network->m_callInProgress = true; } } @@ -218,6 +220,9 @@ bool TagDMRData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId 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; } } diff --git a/src/network/fne/TagNXDNData.cpp b/src/network/fne/TagNXDNData.cpp index fabe861b..4fe24033 100644 --- a/src/network/fne/TagNXDNData.cpp +++ b/src/network/fne/TagNXDNData.cpp @@ -128,6 +128,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI 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? @@ -165,6 +166,7 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI status.streamId = streamId; m_status[dstId] = status; LogMessage(LOG_NET, "NXDN, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); + m_network->m_callInProgress = true; } } } @@ -190,6 +192,9 @@ bool TagNXDNData::processFrame(const uint8_t* data, uint32_t len, uint32_t peerI 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; } } diff --git a/src/network/fne/TagP25Data.cpp b/src/network/fne/TagP25Data.cpp index 28672b64..fecac383 100644 --- a/src/network/fne/TagP25Data.cpp +++ b/src/network/fne/TagP25Data.cpp @@ -170,6 +170,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId 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? @@ -207,6 +208,7 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId status.streamId = streamId; m_status[dstId] = status; LogMessage(LOG_NET, "P25, Call Start, peer = %u, srcId = %u, dstId = %u, streamId = %u", peerId, srcId, dstId, streamId); + m_network->m_callInProgress = true; } } } @@ -232,6 +234,9 @@ bool TagP25Data::processFrame(const uint8_t* data, uint32_t len, uint32_t peerId 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; } }