mirror of
https://github.com/ShaYmez/xlxd.git
synced 2024-10-01 01:06:36 -04:00
Merge pull request #120 from nonoo/master
Prevent sending stream close frames back to the sender
This commit is contained in:
commit
2c902aad20
@ -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 )
|
||||||
{
|
{
|
||||||
|
@ -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 )
|
||||||
@ -103,7 +103,7 @@ void CDextraProtocol::Task(void)
|
|||||||
//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 )
|
||||||
{
|
{
|
||||||
|
@ -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 )
|
||||||
@ -129,7 +129,8 @@ void CDmrmmdvmProtocol::Task(void)
|
|||||||
{
|
{
|
||||||
//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 )
|
||||||
|
@ -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 )
|
||||||
|
@ -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 )
|
||||||
@ -102,7 +102,7 @@ void CDplusProtocol::Task(void)
|
|||||||
//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 )
|
||||||
{
|
{
|
||||||
|
@ -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++ )
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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 *);
|
||||||
|
Loading…
Reference in New Issue
Block a user