1
0
mirror of https://github.com/ShaYmez/xlxd.git synced 2026-06-18 21:38:35 -04:00

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
9 changed files with 57 additions and 47 deletions
+7 -6
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 )
{
+8 -3
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 )
{
+8 -3
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 )
+6 -2
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 )
+8 -3
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 )
{
+9 -16
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++ )
+1 -1
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
+10 -12
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
-1
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 *);