diff --git a/dashboard/changes.txt b/dashboard/changes.txt index e587f33..4bdc7a9 100644 --- a/dashboard/changes.txt +++ b/dashboard/changes.txt @@ -1,13 +1,20 @@ +xlx db v2.1.1 + +- "peers.php" added hyperlink to the peers ip address + xlx db v2.1.0 - + - "index.php" - button "Peers" added - button "Repeaters/Nodes" shows now the number of connected devices - moved XLX name, version and service uptime to improve view on mobile devices -- "class.peer.php" added -- "peers.php" added -- "repeaters.php" limits nodes show up to 100 nodes + button "Peers" added + button "Repeaters/Nodes" shows now the number of connected devices + moved XLX name, version and service uptime to improve view on mobile devices + - "class.peer.php" added + + - "peers.php" added + + - "repeaters.php" limits nodes show up to 100 nodes + xlx db v2.0.6 - "index.php" now reads out the XLX service uptime and not the server uptime @@ -18,4 +25,4 @@ xlx db v2.0.6 xlx db v2.0.5 -- "class.reflector.php" extra callsign checking \ No newline at end of file +- "class.reflector.php" extra callsign checking diff --git a/dashboard/index.php b/dashboard/index.php index dfde41d..3b35ad9 100644 --- a/dashboard/index.php +++ b/dashboard/index.php @@ -80,7 +80,7 @@ for ($i=0;$i
XLX Multiprotocol Gateway Reflector -
 XLX vGetElement($FILECONTENT, "Version"); ?> - Dashboard v2.1.0  /  Service uptime:  XLX vGetElement($FILECONTENT, "Version"); ?> - Dashboard v2.1.1  /  Service uptime: PeerCount();$i++) { '.FormatSeconds(time()-$Reflector->Peers[$i]->GetConnectTime()).' s '.$Reflector->Peers[$i]->GetProtocol().' '.$Reflector->Peers[$i]->GetLinkedModule().' - '.$Reflector->Peers[$i]->GetIP().' + '.$Reflector->Peers[$i]->GetIP().' '; if ($i == 99) { $i = $Reflector->PeerCount()+1; } } diff --git a/src/cclient.h b/src/cclient.h index ab3d53d..528a1ec 100644 --- a/src/cclient.h +++ b/src/cclient.h @@ -64,6 +64,7 @@ public: // identity virtual int GetProtocol(void) const { return PROTOCOL_NONE; } + virtual int GetProtocolRevision(void) const { return 0; } virtual const char *GetProtocolName(void) const { return "none"; } virtual bool IsNode(void) const { return false; } virtual bool IsPeer(void) const { return false; } diff --git a/src/cdcsprotocol.cpp b/src/cdcsprotocol.cpp index 358a0f0..c642e64 100644 --- a/src/cdcsprotocol.cpp +++ b/src/cdcsprotocol.cpp @@ -201,6 +201,7 @@ void CDcsProtocol::Task(void) bool CDcsProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) { bool newstream = false; + CCallsign via(Header->GetRpt1Callsign()); // find the stream CPacketStream *stream = GetStream(Header->GetStreamId()); @@ -211,6 +212,8 @@ bool CDcsProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) CClient *client = g_Reflector.GetClients()->FindClient(Ip, PROTOCOL_DCS); if ( client != NULL ) { + // get client callsign + via = client->GetCallsign(); // and try to open the stream if ( (stream = g_Reflector.OpenStream(Header, client)) != NULL ) { @@ -232,7 +235,7 @@ bool CDcsProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) } // update last heard - g_Reflector.GetUsers()->Hearing(Header->GetMyCallsign(), Header->GetRpt1Callsign()); + g_Reflector.GetUsers()->Hearing(Header->GetMyCallsign(), via); g_Reflector.ReleaseUsers(); // done diff --git a/src/cdextraclient.cpp b/src/cdextraclient.cpp index f5a5b66..6d8a67a 100644 --- a/src/cdextraclient.cpp +++ b/src/cdextraclient.cpp @@ -31,16 +31,19 @@ CDextraClient::CDextraClient() { + m_ProtRev = 0; } -CDextraClient::CDextraClient(const CCallsign &callsign, const CIp &ip, char reflectorModule) +CDextraClient::CDextraClient(const CCallsign &callsign, const CIp &ip, char reflectorModule, int protRev) : CClient(callsign, ip, reflectorModule) { + m_ProtRev = protRev; } CDextraClient::CDextraClient(const CDextraClient &client) : CClient(client) { + m_ProtRev = client.m_ProtRev; } //////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/cdextraclient.h b/src/cdextraclient.h index 9c6a10e..757aad5 100644 --- a/src/cdextraclient.h +++ b/src/cdextraclient.h @@ -39,7 +39,7 @@ class CDextraClient : public CClient public: // constructors CDextraClient(); - CDextraClient(const CCallsign &, const CIp &, char = ' '); + CDextraClient(const CCallsign &, const CIp &, char = ' ', int = 0); CDextraClient(const CDextraClient &); // destructor @@ -47,11 +47,16 @@ public: // identity int GetProtocol(void) const { return PROTOCOL_DEXTRA; } + int GetProtocolRevision(void) const { return m_ProtRev; } const char *GetProtocolName(void) const { return "Dextra"; } bool IsNode(void) const { return true; } // status bool IsAlive(void) const; + +protected: + // data + int m_ProtRev; }; //////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/cdextraprotocol.cpp b/src/cdextraprotocol.cpp index aa7434f..6dbc074 100644 --- a/src/cdextraprotocol.cpp +++ b/src/cdextraprotocol.cpp @@ -66,6 +66,7 @@ void CDextraProtocol::Task(void) CIp Ip; CCallsign Callsign; char ToLinkModule; + int ProtRev; CDvHeaderPacket *Header; CDvFramePacket *Frame; CDvLastFramePacket *LastFrame; @@ -103,7 +104,7 @@ void CDextraProtocol::Task(void) // handle it OnDvLastFramePacketIn(LastFrame); } - else if ( IsValidConnectPacket(Buffer, &Callsign, &ToLinkModule) ) + else if ( IsValidConnectPacket(Buffer, &Callsign, &ToLinkModule, &ProtRev) ) { std::cout << "DExtra connect packet for module " << ToLinkModule << " from " << Callsign << " at " << Ip << std::endl; @@ -115,7 +116,7 @@ void CDextraProtocol::Task(void) m_Socket.Send(Buffer, Ip); // create the client - CDextraClient *client = new CDextraClient(Callsign, Ip, ToLinkModule); + CDextraClient *client = new CDextraClient(Callsign, Ip, ToLinkModule, ProtRev); // and append g_Reflector.GetClients()->AddClient(client); @@ -137,6 +138,13 @@ void CDextraProtocol::Task(void) CClient *client = clients->FindClient(Callsign, Ip, PROTOCOL_DEXTRA); if ( client != NULL ) { + // ack disconnect packet + if ( client->GetProtocolRevision() == 1 ) + { + EncodeDisconnectedPacket(&Buffer); + m_Socket.Send(Buffer, Ip); + } + // and remove it clients->RemoveClient(client); } g_Reflector.ReleaseClients(); @@ -267,6 +275,7 @@ void CDextraProtocol::HandleKeepalives(void) bool CDextraProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) { bool newstream = false; + CCallsign via(Header->GetRpt1Callsign()); // find the stream CPacketStream *stream = GetStream(Header->GetStreamId()); @@ -277,6 +286,8 @@ bool CDextraProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) CClient *client = g_Reflector.GetClients()->FindClient(Ip, PROTOCOL_DEXTRA); if ( client != NULL ) { + // get client callsign + via = client->GetCallsign(); // and try to open the stream if ( (stream = g_Reflector.OpenStream(Header, client)) != NULL ) { @@ -296,7 +307,7 @@ bool CDextraProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) } // update last heard - g_Reflector.GetUsers()->Hearing(Header->GetMyCallsign(), Header->GetRpt1Callsign()); + g_Reflector.GetUsers()->Hearing(Header->GetMyCallsign(), via); g_Reflector.ReleaseUsers(); // done @@ -306,7 +317,7 @@ bool CDextraProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) //////////////////////////////////////////////////////////////////////////////////////// // packet decoding helpers -bool CDextraProtocol::IsValidConnectPacket(const CBuffer &Buffer, CCallsign *callsign, char *reflectormodule) +bool CDextraProtocol::IsValidConnectPacket(const CBuffer &Buffer, CCallsign *callsign, char *reflectormodule, int *revision) { bool valid = false; if ((Buffer.size() == 11) && (Buffer.data()[9] != ' ')) @@ -314,6 +325,7 @@ bool CDextraProtocol::IsValidConnectPacket(const CBuffer &Buffer, CCallsign *cal callsign->SetCallsign(Buffer.data(), 8); callsign->SetModule(Buffer.data()[8]); *reflectormodule = Buffer.data()[9]; + *revision = (Buffer.data()[10] == 11) ? 1 : 0; valid = (callsign->IsValid() && IsLetter(*reflectormodule)); } return valid; @@ -450,6 +462,12 @@ void CDextraProtocol::EncodeDisconnectPacket(CBuffer *Buffer) Buffer->Set(tag, sizeof(tag)); } +void CDextraProtocol::EncodeDisconnectedPacket(CBuffer *Buffer) +{ + uint8 tag[] = { 'D','I','S','C','O','N','N','E','C','T','E','D' }; + Buffer->Set(tag, sizeof(tag)); +} + bool CDextraProtocol::EncodeDvHeaderPacket(const CDvHeaderPacket &Packet, CBuffer *Buffer) const { uint8 tag[] = { 'D','S','V','T',0x10,0x00,0x00,0x00,0x20,0x00,0x01,0x02 }; diff --git a/src/cdextraprotocol.h b/src/cdextraprotocol.h index 9c4ab5d..b73257f 100644 --- a/src/cdextraprotocol.h +++ b/src/cdextraprotocol.h @@ -63,7 +63,7 @@ protected: bool OnDvHeaderPacketIn(CDvHeaderPacket *, const CIp &); // packet decoding helpers - bool IsValidConnectPacket(const CBuffer &, CCallsign *, char *); + bool IsValidConnectPacket(const CBuffer &, CCallsign *, char *, int *); bool IsValidDisconnectPacket(const CBuffer &, CCallsign *); bool IsValidKeepAlivePacket(const CBuffer &, CCallsign *); CDvHeaderPacket *IsValidDvHeaderPacket(const CBuffer &); @@ -75,6 +75,7 @@ protected: void EncodeConnectAckPacket(CBuffer *); void EncodeConnectNackPacket(CBuffer *); void EncodeDisconnectPacket(CBuffer *); + void EncodeDisconnectedPacket(CBuffer *); bool EncodeDvHeaderPacket(const CDvHeaderPacket &, CBuffer *) const; bool EncodeDvFramePacket(const CDvFramePacket &, CBuffer *) const; bool EncodeDvLastFramePacket(const CDvLastFramePacket &, CBuffer *) const; diff --git a/src/cdplusprotocol.cpp b/src/cdplusprotocol.cpp index 6468a4f..3003f7b 100644 --- a/src/cdplusprotocol.cpp +++ b/src/cdplusprotocol.cpp @@ -194,6 +194,7 @@ void CDplusProtocol::Task(void) bool CDplusProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) { bool newstream = false; + CCallsign via(Header->GetRpt1Callsign()); // find the stream CPacketStream *stream = GetStream(Header->GetStreamId()); @@ -209,6 +210,8 @@ bool CDplusProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) { client->SetModule(Header->GetRpt1Module()); } + // get client callsign + via = client->GetCallsign(); // and try to open the stream if ( (stream = g_Reflector.OpenStream(Header, client)) != NULL ) { @@ -230,7 +233,7 @@ bool CDplusProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) } // update last heard - g_Reflector.GetUsers()->Hearing(Header->GetMyCallsign(), Header->GetRpt1Callsign()); + g_Reflector.GetUsers()->Hearing(Header->GetMyCallsign(), via); g_Reflector.ReleaseUsers(); // done diff --git a/src/cdvheaderpacket.h b/src/cdvheaderpacket.h index b4acf33..6c80c80 100644 --- a/src/cdvheaderpacket.h +++ b/src/cdvheaderpacket.h @@ -112,7 +112,7 @@ protected: uint16 m_uiCrc; #ifdef IMPLEMENT_CDVHEADERPACKET_CONST_CHAR_OPERATOR // buffer - char m_sz[32]; + char m_sz[256]; #endif }; diff --git a/src/main.h b/src/main.h index 1f8f32d..c1b0e94 100644 --- a/src/main.h +++ b/src/main.h @@ -48,7 +48,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 2 -#define VERSION_REVISION 4 +#define VERSION_REVISION 6 // global ------------------------------------------------------ diff --git a/src/makefile b/src/makefile index f04eff2..d2baee0 100644 --- a/src/makefile +++ b/src/makefile @@ -18,7 +18,10 @@ clean: install: mkdir -p /xlxd + mv /xlxd/xlxd.blacklist /xlxd/xlxd.blacklist.bak + mv /xlxd/xlxd.whitelist /xlxd/xlxd.whitelist.bak + mv /xlxd/xlxd.interlink /xlxd/xlxd.interlink.bak cp ./xlxd /xlxd/ - cp -i ../config/xlxd.blacklist /xlxd/ - cp -i ../config/xlxd.whitelist /xlxd/ - cp -i ../config/xlxd.interlink /xlxd/ + cp ../config/xlxd.blacklist /xlxd/ + cp ../config/xlxd.whitelist /xlxd/ + cp ../config/xlxd.interlink /xlxd/