1
0
mirror of https://github.com/ShaYmez/xlxd.git synced 2025-06-15 03:52:26 -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:
Nonoo 2019-02-19 12:39:48 +01:00
parent b3360b66e2
commit 6b281b9fdb
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 *);