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:
parent
b3360b66e2
commit
6b281b9fdb
@ -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 )
|
||||||
@ -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 )
|
||||||
{
|
{
|
||||||
|
@ -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 )
|
||||||
|
@ -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 )
|
||||||
@ -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 )
|
||||||
{
|
{
|
||||||
|
@ -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…
x
Reference in New Issue
Block a user