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;
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 )
{

View File

@ -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 )
{

View File

@ -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 )

View File

@ -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 )

View File

@ -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 )
{

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
@ -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++ )

View File

@ -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

View File

@ -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

View File

@ -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 *);