1
0
mirror of https://github.com/ShaYmez/xlxd.git synced 2025-08-05 06:42:27 -04:00

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.
This commit is contained in:
Nonoo 2019-02-19 12:39:48 +01:00
parent b3360b66e2
commit 6b281b9fdb
9 changed files with 57 additions and 47 deletions

View File

@ -68,7 +68,7 @@ void CDcsProtocol::Task(void)
CCallsign Callsign; CCallsign Callsign;
char ToLinkModule; char ToLinkModule;
CDvHeaderPacket *Header; CDvHeaderPacket *Header;
CDvFramePacket *Frame; CDvFramePacket *Frame = NULL;
// handle incoming packets // handle incoming packets
if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 )
@ -89,16 +89,12 @@ void CDcsProtocol::Task(void)
//std::cout << "DCS DV frame" << std::endl; //std::cout << "DCS DV frame" << std::endl;
OnDvFramePacketIn(Frame, &Ip); OnDvFramePacketIn(Frame, &Ip);
} }
else
{
//std::cout << "DCS DV last frame" << std::endl;
OnDvLastFramePacketIn((CDvLastFramePacket *)Frame, &Ip);
}
} }
else else
{ {
delete Header; delete Header;
delete Frame; delete Frame;
Frame = NULL;
} }
} }
else if ( IsValidConnectPacket(Buffer, &Callsign, &ToLinkModule) ) else if ( IsValidConnectPacket(Buffer, &Callsign, &ToLinkModule) )
@ -188,6 +184,11 @@ void CDcsProtocol::Task(void)
// handle queue from reflector // handle queue from reflector
HandleQueue(); HandleQueue();
if ( Frame != NULL && Frame->IsLastPacket() )
{
CloseStreamForDvLastFramePacket((CDvLastFramePacket *)Frame, &Ip);
}
// keep client alive // keep client alive
if ( m_LastKeepaliveTime.DurationSinceNow() > DCS_KEEPALIVE_PERIOD ) if ( m_LastKeepaliveTime.DurationSinceNow() > DCS_KEEPALIVE_PERIOD )
{ {

View File

@ -69,7 +69,7 @@ void CDextraProtocol::Task(void)
int ProtRev; int ProtRev;
CDvHeaderPacket *Header; CDvHeaderPacket *Header;
CDvFramePacket *Frame; CDvFramePacket *Frame;
CDvLastFramePacket *LastFrame; CDvLastFramePacket *LastFrame = NULL;
// any incoming packet ? // any incoming packet ?
if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 )
@ -101,9 +101,9 @@ void CDextraProtocol::Task(void)
else if ( (LastFrame = IsValidDvLastFramePacket(Buffer)) != NULL ) else if ( (LastFrame = IsValidDvLastFramePacket(Buffer)) != NULL )
{ {
//std::cout << "DExtra DV last frame" << std::endl; //std::cout << "DExtra DV last frame" << std::endl;
// handle it // handle it
OnDvLastFramePacketIn(LastFrame, &Ip); OnDvFramePacketIn(LastFrame, &Ip);
} }
else if ( IsValidConnectPacket(Buffer, &Callsign, &ToLinkModule, &ProtRev) ) else if ( IsValidConnectPacket(Buffer, &Callsign, &ToLinkModule, &ProtRev) )
{ {
@ -193,6 +193,11 @@ void CDextraProtocol::Task(void)
// handle queue from reflector // handle queue from reflector
HandleQueue(); HandleQueue();
if ( LastFrame != NULL )
{
CloseStreamForDvLastFramePacket(LastFrame, &Ip);
}
// keep client alive // keep client alive
if ( m_LastKeepaliveTime.DurationSinceNow() > DEXTRA_KEEPALIVE_PERIOD ) if ( m_LastKeepaliveTime.DurationSinceNow() > DEXTRA_KEEPALIVE_PERIOD )
{ {

View File

@ -93,7 +93,7 @@ void CDmrmmdvmProtocol::Task(void)
uint8 CallType; uint8 CallType;
CDvHeaderPacket *Header; CDvHeaderPacket *Header;
CDvFramePacket *Frames[3]; CDvFramePacket *Frames[3];
CDvLastFramePacket *LastFrame; CDvLastFramePacket *LastFrame = NULL;
// handle incoming packets // handle incoming packets
if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 )
@ -128,8 +128,9 @@ void CDmrmmdvmProtocol::Task(void)
else if ( IsValidDvLastFramePacket(Buffer, &LastFrame) ) else if ( IsValidDvLastFramePacket(Buffer, &LastFrame) )
{ {
//std::cout << "DMRmmdvm DV last frame" << std::endl; //std::cout << "DMRmmdvm DV last frame" << std::endl;
OnDvLastFramePacketIn(LastFrame, &Ip); // handle it
OnDvFramePacketIn(LastFrame, &Ip);
} }
else if ( IsValidConnectPacket(Buffer, &Callsign, Ip) ) else if ( IsValidConnectPacket(Buffer, &Callsign, Ip) )
{ {
@ -257,6 +258,10 @@ void CDmrmmdvmProtocol::Task(void)
// handle queue from reflector // handle queue from reflector
HandleQueue(); HandleQueue();
if ( LastFrame != NULL )
{
CloseStreamForDvLastFramePacket(LastFrame, &Ip);
}
// keep client alive // keep client alive
if ( m_LastKeepaliveTime.DurationSinceNow() > DMRMMDVM_KEEPALIVE_PERIOD ) if ( m_LastKeepaliveTime.DurationSinceNow() > DMRMMDVM_KEEPALIVE_PERIOD )

View File

@ -83,6 +83,7 @@ void CDmrplusProtocol::Task(void)
char ToLinkModule; char ToLinkModule;
CDvHeaderPacket *Header; CDvHeaderPacket *Header;
CDvFramePacket *Frames[3]; CDvFramePacket *Frames[3];
int CloseStreamFrameNr = -1;
// handle incoming packets // handle incoming packets
if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 )
@ -99,12 +100,11 @@ void CDmrplusProtocol::Task(void)
/*if ( !Frames[i]->IsLastPacket() ) /*if ( !Frames[i]->IsLastPacket() )
{ {
//std::cout << "DMRplus DV frame" << std::endl; //std::cout << "DMRplus DV frame" << std::endl;
OnDvFramePacketIn(Frames[i], &Ip);
} }
else else
{ {
//std::cout << "DMRplus DV last frame" << std::endl; //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 // handle queue from reflector
HandleQueue(); HandleQueue();
if ( CloseStreamFrameNr >= 0 )
{
CloseStreamForDvLastFramePacket((CDvLastFramePacket *)Frames[CloseStreamFrameNr], &Ip);
}
// keep client alive // keep client alive
if ( m_LastKeepaliveTime.DurationSinceNow() > DMRPLUS_KEEPALIVE_PERIOD ) if ( m_LastKeepaliveTime.DurationSinceNow() > DMRPLUS_KEEPALIVE_PERIOD )

View File

@ -69,7 +69,7 @@ void CDplusProtocol::Task(void)
CCallsign Callsign; CCallsign Callsign;
CDvHeaderPacket *Header; CDvHeaderPacket *Header;
CDvFramePacket *Frame; CDvFramePacket *Frame;
CDvLastFramePacket *LastFrame; CDvLastFramePacket *LastFrame = NULL;
// handle incoming packets // handle incoming packets
if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 )
@ -100,9 +100,9 @@ void CDplusProtocol::Task(void)
else if ( (LastFrame = IsValidDvLastFramePacket(Buffer)) != NULL ) else if ( (LastFrame = IsValidDvLastFramePacket(Buffer)) != NULL )
{ {
//std::cout << "DPlus DV last frame" << std::endl; //std::cout << "DPlus DV last frame" << std::endl;
// handle it // handle it
OnDvLastFramePacketIn(LastFrame, &Ip); OnDvFramePacketIn(LastFrame, &Ip);
} }
else if ( IsValidConnectPacket(Buffer) ) else if ( IsValidConnectPacket(Buffer) )
{ {
@ -180,6 +180,11 @@ void CDplusProtocol::Task(void)
// handle queue from reflector // handle queue from reflector
HandleQueue(); HandleQueue();
if ( LastFrame )
{
CloseStreamForDvLastFramePacket(LastFrame, &Ip);
}
// keep client alive // keep client alive
if ( m_LastKeepaliveTime.DurationSinceNow() > DPLUS_KEEPALIVE_PERIOD ) if ( m_LastKeepaliveTime.DurationSinceNow() > DPLUS_KEEPALIVE_PERIOD )
{ {

View File

@ -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 // stream handle helpers
@ -187,6 +171,15 @@ CPacketStream *CProtocol::GetStream(uint16 uiStreamId, const CIp *Ip)
return stream; 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) void CProtocol::CheckStreamsTimeout(void)
{ {
for ( int i = 0; i < m_Streams.size(); i++ ) for ( int i = 0; i < m_Streams.size(); i++ )

View File

@ -100,10 +100,10 @@ protected:
// stream helpers // stream helpers
virtual bool OnDvHeaderPacketIn(CDvHeaderPacket *, const CIp &) { return false; } virtual bool OnDvHeaderPacketIn(CDvHeaderPacket *, const CIp &) { return false; }
virtual void OnDvFramePacketIn(CDvFramePacket *, const CIp * = NULL); virtual void OnDvFramePacketIn(CDvFramePacket *, const CIp * = NULL);
virtual void OnDvLastFramePacketIn(CDvLastFramePacket *, const CIp * = NULL);
// stream handle helpers // stream handle helpers
CPacketStream *GetStream(uint16, const CIp * = NULL); CPacketStream *GetStream(uint16, const CIp * = NULL);
void CloseStreamForDvLastFramePacket(CDvLastFramePacket *, const CIp * = NULL);
void CheckStreamsTimeout(void); void CheckStreamsTimeout(void);
// queue helper // queue helper

View File

@ -71,7 +71,7 @@ void CXlxProtocol::Task(void)
CVersion Version; CVersion Version;
CDvHeaderPacket *Header; CDvHeaderPacket *Header;
CDvFramePacket *Frame; CDvFramePacket *Frame;
CDvLastFramePacket *LastFrame; CDvLastFramePacket *LastFrame = NULL;
// any incoming packet ? // any incoming packet ?
if ( m_Socket.Receive(&Buffer, &Ip, 20) != -1 ) 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; //std::cout << "XLX (DExtra) DV last frame" << std::endl;
// handle it // tag packet as remote peer origin
OnDvLastFramePacketIn(LastFrame, &Ip); LastFrame->SetRemotePeerOrigin();
OnDvFramePacketIn((CDvFramePacket *)LastFrame, &Ip);
} }
else if ( IsValidConnectPacket(Buffer, &Callsign, Modules, &Version) ) else if ( IsValidConnectPacket(Buffer, &Callsign, Modules, &Version) )
{ {
@ -219,6 +221,11 @@ void CXlxProtocol::Task(void)
// handle queue from reflector // handle queue from reflector
HandleQueue(); HandleQueue();
if ( LastFrame != NULL )
{
CloseStreamForDvLastFramePacket(LastFrame, &Ip);
}
// keep alive // keep alive
if ( m_LastKeepaliveTime.DurationSinceNow() > XLX_KEEPALIVE_PERIOD ) if ( m_LastKeepaliveTime.DurationSinceNow() > XLX_KEEPALIVE_PERIOD )
{ {
@ -467,15 +474,6 @@ void CXlxProtocol::OnDvFramePacketIn(CDvFramePacket *DvFrame, const CIp *Ip)
CDextraProtocol::OnDvFramePacketIn(DvFrame, 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 // packet decoding helpers

View File

@ -63,7 +63,6 @@ protected:
// stream helpers // stream helpers
bool OnDvHeaderPacketIn(CDvHeaderPacket *, const CIp &); bool OnDvHeaderPacketIn(CDvHeaderPacket *, const CIp &);
void OnDvFramePacketIn(CDvFramePacket *, const CIp * = NULL); void OnDvFramePacketIn(CDvFramePacket *, const CIp * = NULL);
void OnDvLastFramePacketIn(CDvLastFramePacket *, const CIp * = NULL);
// packet decoding helpers // packet decoding helpers
bool IsValidKeepAlivePacket(const CBuffer &, CCallsign *); bool IsValidKeepAlivePacket(const CBuffer &, CCallsign *);