Merge pull request #120 from nonoo/master

Prevent sending stream close frames back to the sender
This commit is contained in:
LX3JL 2019-02-25 08:59:15 +01:00 committed by GitHub
commit 2c902aad20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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 *);