mirror of
https://github.com/nostar/urfd.git
synced 2026-11-08 04:19:39 +00:00
Fix disconnects on YSF/P25/NXDN
This commit is contained in:
1 parent
47387307b0
commit
58a4e37ca0
5 files changed
+46
-4
No files matched your search
@@ -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> &);
|
||||
|
||||
Reference in new issue
Block a user