From 6b281b9fdbae2b7f4cd0ffe23c52619d2617649d Mon Sep 17 00:00:00 2001 From: Nonoo Date: Tue, 19 Feb 2019 12:39:48 +0100 Subject: [PATCH] Prevent sending stream close frames back to the sender The OnDvLastFramePacketIn() function closed the current stream before HandleQueue() was called, so the stream's client lost it's stream master status and HandleQueue() sent the client's last (stream closing) frame back to the sender. Applying this commit closes the stream only after HandleQueue() has been called so no unnecessary call end frame reflection happens to the transmitting client. --- src/cdcsprotocol.cpp | 13 +++++++------ src/cdextraprotocol.cpp | 11 ++++++++--- src/cdmrmmdvmprotocol.cpp | 11 ++++++++--- src/cdmrplusprotocol.cpp | 8 ++++++-- src/cdplusprotocol.cpp | 11 ++++++++--- src/cprotocol.cpp | 25 +++++++++---------------- src/cprotocol.h | 2 +- src/cxlxprotocol.cpp | 22 ++++++++++------------ src/cxlxprotocol.h | 1 - 9 files changed, 57 insertions(+), 47 deletions(-) diff --git a/src/cdcsprotocol.cpp b/src/cdcsprotocol.cpp index 27a0d79..937b3a0 100644 --- a/src/cdcsprotocol.cpp +++ b/src/cdcsprotocol.cpp @@ -68,7 +68,7 @@ void CDcsProtocol::Task(void) CCallsign Callsign; char ToLinkModule; CDvHeaderPacket *Header; - CDvFramePacket *Frame; + CDvFramePacket *Frame = NULL; // handle incoming packets if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) @@ -89,16 +89,12 @@ void CDcsProtocol::Task(void) //std::cout << "DCS DV frame" << std::endl; OnDvFramePacketIn(Frame, &Ip); } - else - { - //std::cout << "DCS DV last frame" << std::endl; - OnDvLastFramePacketIn((CDvLastFramePacket *)Frame, &Ip); - } } else { delete Header; delete Frame; + Frame = NULL; } } else if ( IsValidConnectPacket(Buffer, &Callsign, &ToLinkModule) ) @@ -188,6 +184,11 @@ void CDcsProtocol::Task(void) // handle queue from reflector HandleQueue(); + if ( Frame != NULL && Frame->IsLastPacket() ) + { + CloseStreamForDvLastFramePacket((CDvLastFramePacket *)Frame, &Ip); + } + // keep client alive if ( m_LastKeepaliveTime.DurationSinceNow() > DCS_KEEPALIVE_PERIOD ) { diff --git a/src/cdextraprotocol.cpp b/src/cdextraprotocol.cpp index 8aa88ab..3422df8 100644 --- a/src/cdextraprotocol.cpp +++ b/src/cdextraprotocol.cpp @@ -69,7 +69,7 @@ void CDextraProtocol::Task(void) int ProtRev; CDvHeaderPacket *Header; CDvFramePacket *Frame; - CDvLastFramePacket *LastFrame; + CDvLastFramePacket *LastFrame = NULL; // any incoming packet ? if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) @@ -101,9 +101,9 @@ void CDextraProtocol::Task(void) else if ( (LastFrame = IsValidDvLastFramePacket(Buffer)) != NULL ) { //std::cout << "DExtra DV last frame" << std::endl; - + // handle it - OnDvLastFramePacketIn(LastFrame, &Ip); + OnDvFramePacketIn(LastFrame, &Ip); } else if ( IsValidConnectPacket(Buffer, &Callsign, &ToLinkModule, &ProtRev) ) { @@ -193,6 +193,11 @@ void CDextraProtocol::Task(void) // handle queue from reflector HandleQueue(); + if ( LastFrame != NULL ) + { + CloseStreamForDvLastFramePacket(LastFrame, &Ip); + } + // keep client alive if ( m_LastKeepaliveTime.DurationSinceNow() > DEXTRA_KEEPALIVE_PERIOD ) { diff --git a/src/cdmrmmdvmprotocol.cpp b/src/cdmrmmdvmprotocol.cpp index 2398fd1..621506f 100644 --- a/src/cdmrmmdvmprotocol.cpp +++ b/src/cdmrmmdvmprotocol.cpp @@ -93,7 +93,7 @@ void CDmrmmdvmProtocol::Task(void) uint8 CallType; CDvHeaderPacket *Header; CDvFramePacket *Frames[3]; - CDvLastFramePacket *LastFrame; + CDvLastFramePacket *LastFrame = NULL; // handle incoming packets if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) @@ -128,8 +128,9 @@ void CDmrmmdvmProtocol::Task(void) else if ( IsValidDvLastFramePacket(Buffer, &LastFrame) ) { //std::cout << "DMRmmdvm DV last frame" << std::endl; - - OnDvLastFramePacketIn(LastFrame, &Ip); + + // handle it + OnDvFramePacketIn(LastFrame, &Ip); } else if ( IsValidConnectPacket(Buffer, &Callsign, Ip) ) { @@ -257,6 +258,10 @@ void CDmrmmdvmProtocol::Task(void) // handle queue from reflector HandleQueue(); + if ( LastFrame != NULL ) + { + CloseStreamForDvLastFramePacket(LastFrame, &Ip); + } // keep client alive if ( m_LastKeepaliveTime.DurationSinceNow() > DMRMMDVM_KEEPALIVE_PERIOD ) diff --git a/src/cdmrplusprotocol.cpp b/src/cdmrplusprotocol.cpp index 1d1180f..d62615a 100644 --- a/src/cdmrplusprotocol.cpp +++ b/src/cdmrplusprotocol.cpp @@ -83,6 +83,7 @@ void CDmrplusProtocol::Task(void) char ToLinkModule; CDvHeaderPacket *Header; CDvFramePacket *Frames[3]; + int CloseStreamFrameNr = -1; // handle incoming packets if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) @@ -99,12 +100,11 @@ void CDmrplusProtocol::Task(void) /*if ( !Frames[i]->IsLastPacket() ) { //std::cout << "DMRplus DV frame" << std::endl; - OnDvFramePacketIn(Frames[i], &Ip); } else { //std::cout << "DMRplus DV last frame" << std::endl; - OnDvLastFramePacketIn((CDvLastFramePacket *)Frames[i], &Ip); + CloseStreamFrameNr = i; }*/ } } @@ -190,6 +190,10 @@ void CDmrplusProtocol::Task(void) // handle queue from reflector HandleQueue(); + if ( CloseStreamFrameNr >= 0 ) + { + CloseStreamForDvLastFramePacket((CDvLastFramePacket *)Frames[CloseStreamFrameNr], &Ip); + } // keep client alive if ( m_LastKeepaliveTime.DurationSinceNow() > DMRPLUS_KEEPALIVE_PERIOD ) diff --git a/src/cdplusprotocol.cpp b/src/cdplusprotocol.cpp index 86aa4fb..6477e93 100644 --- a/src/cdplusprotocol.cpp +++ b/src/cdplusprotocol.cpp @@ -69,7 +69,7 @@ void CDplusProtocol::Task(void) CCallsign Callsign; CDvHeaderPacket *Header; CDvFramePacket *Frame; - CDvLastFramePacket *LastFrame; + CDvLastFramePacket *LastFrame = NULL; // handle incoming packets if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) @@ -100,9 +100,9 @@ void CDplusProtocol::Task(void) else if ( (LastFrame = IsValidDvLastFramePacket(Buffer)) != NULL ) { //std::cout << "DPlus DV last frame" << std::endl; - + // handle it - OnDvLastFramePacketIn(LastFrame, &Ip); + OnDvFramePacketIn(LastFrame, &Ip); } else if ( IsValidConnectPacket(Buffer) ) { @@ -180,6 +180,11 @@ void CDplusProtocol::Task(void) // handle queue from reflector HandleQueue(); + if ( LastFrame ) + { + CloseStreamForDvLastFramePacket(LastFrame, &Ip); + } + // keep client alive if ( m_LastKeepaliveTime.DurationSinceNow() > DPLUS_KEEPALIVE_PERIOD ) { diff --git a/src/cprotocol.cpp b/src/cprotocol.cpp index a5d2adb..e27ad13 100644 --- a/src/cprotocol.cpp +++ b/src/cprotocol.cpp @@ -148,22 +148,6 @@ void CProtocol::OnDvFramePacketIn(CDvFramePacket *Frame, const CIp *Ip) } } -void CProtocol::OnDvLastFramePacketIn(CDvLastFramePacket *Frame, const CIp *Ip) -{ - // find the stream - CPacketStream *stream = GetStream(Frame->GetStreamId(), Ip); - if ( stream != NULL ) - { - // push - stream->Lock(); - stream->Push(Frame); - stream->Unlock(); - - // and close the stream - g_Reflector.CloseStream(stream); - } -} - //////////////////////////////////////////////////////////////////////////////////////// // stream handle helpers @@ -187,6 +171,15 @@ CPacketStream *CProtocol::GetStream(uint16 uiStreamId, const CIp *Ip) return stream; } +void CProtocol::CloseStreamForDvLastFramePacket(CDvLastFramePacket *Frame, const CIp *Ip) +{ + CPacketStream *stream = GetStream(Frame->GetStreamId(), Ip); + if ( stream != NULL ) + { + g_Reflector.CloseStream(stream); + } +} + void CProtocol::CheckStreamsTimeout(void) { for ( int i = 0; i < m_Streams.size(); i++ ) diff --git a/src/cprotocol.h b/src/cprotocol.h index 60ad0dc..e017746 100644 --- a/src/cprotocol.h +++ b/src/cprotocol.h @@ -100,10 +100,10 @@ protected: // stream helpers virtual bool OnDvHeaderPacketIn(CDvHeaderPacket *, const CIp &) { return false; } virtual void OnDvFramePacketIn(CDvFramePacket *, const CIp * = NULL); - virtual void OnDvLastFramePacketIn(CDvLastFramePacket *, const CIp * = NULL); // stream handle helpers CPacketStream *GetStream(uint16, const CIp * = NULL); + void CloseStreamForDvLastFramePacket(CDvLastFramePacket *, const CIp * = NULL); void CheckStreamsTimeout(void); // queue helper diff --git a/src/cxlxprotocol.cpp b/src/cxlxprotocol.cpp index f01fb9a..8250080 100644 --- a/src/cxlxprotocol.cpp +++ b/src/cxlxprotocol.cpp @@ -71,7 +71,7 @@ void CXlxProtocol::Task(void) CVersion Version; CDvHeaderPacket *Header; CDvFramePacket *Frame; - CDvLastFramePacket *LastFrame; + CDvLastFramePacket *LastFrame = NULL; // any incoming packet ? if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) @@ -104,8 +104,10 @@ void CXlxProtocol::Task(void) { //std::cout << "XLX (DExtra) DV last frame" << std::endl; - // handle it - OnDvLastFramePacketIn(LastFrame, &Ip); + // tag packet as remote peer origin + LastFrame->SetRemotePeerOrigin(); + + OnDvFramePacketIn((CDvFramePacket *)LastFrame, &Ip); } else if ( IsValidConnectPacket(Buffer, &Callsign, Modules, &Version) ) { @@ -219,6 +221,11 @@ void CXlxProtocol::Task(void) // handle queue from reflector HandleQueue(); + if ( LastFrame != NULL ) + { + CloseStreamForDvLastFramePacket(LastFrame, &Ip); + } + // keep alive if ( m_LastKeepaliveTime.DurationSinceNow() > XLX_KEEPALIVE_PERIOD ) { @@ -467,15 +474,6 @@ void CXlxProtocol::OnDvFramePacketIn(CDvFramePacket *DvFrame, const CIp *Ip) CDextraProtocol::OnDvFramePacketIn(DvFrame, Ip); } -void CXlxProtocol::OnDvLastFramePacketIn(CDvLastFramePacket *DvFrame, const CIp *Ip) -{ - // tag packet as remote peer origin - DvFrame->SetRemotePeerOrigin(); - - // anc call base class - CDextraProtocol::OnDvLastFramePacketIn(DvFrame, Ip); -} - //////////////////////////////////////////////////////////////////////////////////////// // packet decoding helpers diff --git a/src/cxlxprotocol.h b/src/cxlxprotocol.h index 1b8d8d9..20604c2 100644 --- a/src/cxlxprotocol.h +++ b/src/cxlxprotocol.h @@ -63,7 +63,6 @@ protected: // stream helpers bool OnDvHeaderPacketIn(CDvHeaderPacket *, const CIp &); void OnDvFramePacketIn(CDvFramePacket *, const CIp * = NULL); - void OnDvLastFramePacketIn(CDvLastFramePacket *, const CIp * = NULL); // packet decoding helpers bool IsValidKeepAlivePacket(const CBuffer &, CCallsign *);