Fix disconnects on YSF/P25/NXDN

This commit is contained in:
Doug McLain committed 2023-01-14 16:00:29 -05:00
1 parent 47387307b0
commit 58a4e37ca0
5 files changed
+46 -4

No files matched your search

+15 -1
View File
@@ -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' };
+1 -1
View File
@@ -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 &);
+1 -1
View File
@@ -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
+28
View File
@@ -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' };
+1 -1
View File
@@ -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> &);