Fix disconnects on YSF/P25/NXDN

pull/8/head
Doug McLain 3 years ago
parent 47387307b0
commit 58a4e37ca0

@ -148,6 +148,20 @@ void CNXDNProtocol::Task(void)
g_Reflector.ReleaseClients();
}
}
else if ( IsValidDisconnectPacket(Buffer) )
{
std::cout << "NXDN disconnect packet from " << Ip << std::endl;
// find client
CClients *clients = g_Reflector.GetClients();
std::shared_ptr<CClient>client = clients->FindClient(Ip, EProtocol::nxdn);
if ( client != nullptr )
{
// remove it
clients->RemoveClient(client);
}
g_Reflector.ReleaseClients();
}
else
{
#ifdef DEBUG
@ -347,7 +361,7 @@ bool CNXDNProtocol::IsValidConnectPacket(const CBuffer &Buffer, CCallsign *calls
return valid;
}
bool CNXDNProtocol::IsValidDisconnectPacket(const CBuffer &Buffer, CCallsign *callsign)
bool CNXDNProtocol::IsValidDisconnectPacket(const CBuffer &Buffer)
{
uint8_t tag[] = { 'N','X','D','N','U' };

@ -68,7 +68,7 @@ protected:
// DV packet decoding helpers
bool IsValidConnectPacket(const CBuffer &, CCallsign *);
bool IsValidDisconnectPacket(const CBuffer &, CCallsign *);
bool IsValidDisconnectPacket(const CBuffer &);
bool IsValidDvHeaderPacket(const CIp &, const CBuffer &, std::unique_ptr<CDvHeaderPacket> &);
bool IsValidDvFramePacket(const CIp &, const CBuffer &, std::unique_ptr<CDvHeaderPacket> &, std::array<std::unique_ptr<CDvFramePacket>, 4> &);
bool IsValidDvLastFramePacket(const CIp &, const CBuffer &);

@ -142,7 +142,7 @@ void CP25Protocol::Task(void)
// find client
CClients *clients = g_Reflector.GetClients();
std::shared_ptr<CClient>client = clients->FindClient(Ip, EProtocol::m17);
std::shared_ptr<CClient>client = clients->FindClient(Ip, EProtocol::p25);
if ( client != nullptr )
{
// remove it

@ -171,6 +171,23 @@ void CYsfProtocol::Task(void)
g_Reflector.ReleaseClients();
}
}
else if ( IsValidDisconnectPacket(Buffer) )
{
std::cout << "YSF disconnect packet from " << Ip << std::endl;
// find client
CClients *clients = g_Reflector.GetClients();
std::shared_ptr<CClient>client = clients->FindClient(Ip, EProtocol::ysf);
if ( client != nullptr )
{
// remove it
clients->RemoveClient(client);
// and acknowledge the disconnect
//EncodeDisconnectPacket(&Buffer);
//Send(Buffer, Ip);
}
g_Reflector.ReleaseClients();
}
else if ( IsValidwirexPacket(Buffer, &Fich, &Callsign, &iWiresxCmd, &iWiresxArg) )
{
// std::cout << "Got a WiresX command from " << Callsign << " at " << Ip << " cmd=" <<iWiresxCmd << " arg=" << iWiresxArg << std::endl;
@ -398,6 +415,17 @@ bool CYsfProtocol::IsValidConnectPacket(const CBuffer &Buffer, CCallsign *callsi
return valid;
}
bool CYsfProtocol::IsValidDisconnectPacket(const CBuffer &Buffer)
{
uint8_t tag[] = { 'Y','S','F','U' };
if ( (Buffer.size() == 14) && (Buffer.Compare(tag, sizeof(tag)) == 0) )
{
return true;
}
return false;
}
bool CYsfProtocol::IsValidDvPacket(const CBuffer &Buffer, CYSFFICH *Fich)
{
uint8_t tag[] = { 'Y','S','F','D' };

@ -82,7 +82,7 @@ protected:
// DV packet decoding helpers
bool IsValidConnectPacket(const CBuffer &, CCallsign *);
//bool IsValidDisconnectPacket(const CBuffer &, CCallsign *);
bool IsValidDisconnectPacket(const CBuffer &);
bool IsValidDvPacket(const CBuffer &, CYSFFICH *);
bool IsValidDvHeaderPacket(const CIp &, const CYSFFICH &, const CBuffer &, std::unique_ptr<CDvHeaderPacket> &, std::array<std::unique_ptr<CDvFramePacket>, 5> &);
bool IsValidDvFramePacket(const CIp &, const CYSFFICH &, const CBuffer &, std::unique_ptr<CDvHeaderPacket> &, std::array<std::unique_ptr<CDvFramePacket>, 5> &);

Loading…
Cancel
Save

Powered by TurnKey Linux.