From e1cf5f5c925e346d929af1dd4a2a9c8aba086adb Mon Sep 17 00:00:00 2001 From: LX3JL Date: Fri, 26 Feb 2016 20:44:30 +0100 Subject: [PATCH] xlx 1.3.4 * improved DCS compatibility * added full REFxxx DPlus support * added more flags & countries in dashboard --- dashboard/img/flags/cw.png | Bin 0 -> 3146 bytes dashboard/pgs/country.csv | 12 +++---- src/cclient.h | 2 ++ src/cdcsprotocol.cpp | 63 +++++++++++++++++++++++++------------ src/cdcsprotocol.h | 5 +-- src/cdplusclient.cpp | 3 ++ src/cdplusclient.h | 6 ++++ src/cdplusprotocol.cpp | 43 +++++++++++++++++++++---- src/main.h | 2 +- 9 files changed, 101 insertions(+), 35 deletions(-) create mode 100644 dashboard/img/flags/cw.png diff --git a/dashboard/img/flags/cw.png b/dashboard/img/flags/cw.png new file mode 100644 index 0000000000000000000000000000000000000000..9d431c873980d9457492b5f2ec6ab250e444ccc9 GIT binary patch literal 3146 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 literal 0 HcmV?d00001 diff --git a/dashboard/pgs/country.csv b/dashboard/pgs/country.csv index 389dd17..9a8218c 100644 --- a/dashboard/pgs/country.csv +++ b/dashboard/pgs/country.csv @@ -55,7 +55,7 @@ Costa Rica;CR;TI-TE Cote d'Ivoire;CI;TU Croatia;HR;9A Cuba;CU;CO-CM -Curaçao;CW;PJ2 +Curacao;CW;PJ2 Cyprus;CY;5B-C4-P3 Czech Republic;CZ;OK-OL Denmark;DK;OU-OV-OW-OZ @@ -73,10 +73,10 @@ Falkland Islands (Malvinas);FK;VP8 Faroe Islands;FO;OY Fiji;FJ;3D2 Finland;FI;OF-OG-OH-OI -France;FR;F0-F1-F2-F3-F4-F5-F6-F7-F8-F9 +France;FR;F0-F1-F2-F3-F4-F5-F6-F7-F8-F9-TK French Guiana;GF;FY French Polynesia;PF;FO-TX -French Southern Territories;TF;TK +French Southern Territories;TF; Gabon;GA;TR Gambia;GM;C5 Georgia;GE;4L @@ -104,7 +104,7 @@ India;IN;VU Indonesia;ID;YB-YC-YD-YE-YF-YG-YH Iran, Islamic Republic of;IR;EP-EQ Iraq;IQ;YI -Ireland;IE;EI-EJ-MI +Ireland;IE;EI-EJ-MI-GI Isle of Man;IM;GD-GT Israel;IL;4X-4Z Italy;IT;I0-I1-I2-I3-I4-I5-I6-I7-I8-I9-IK-TR-IT-IU-IW-IZ @@ -175,7 +175,7 @@ Peru;PE;OA-OB-OC Philippines;PH;DU-DV-DW-DX-DY-DZ-4D-4E-4F-4G-4H-4I Pitcairn;PN;VP6 Poland;PL;SN-SO-SP-SQ-SR -Portugal;PT;CT +Portugal;PT;CT-CU3 Puerto Rico;PR;KP3-KP4 Qatar;QA;A7 Reunion;RE;FR-TO @@ -234,7 +234,7 @@ Uganda;UG;5X Ukraine;UA;UR-US-UT-UU-UV-UW-UX-UY-UZ United Arab Emirates;AE;A6 United Kingdom;GB;2E-M0-M1-M2-M3-M4-M5-M6-M7-M8-M9-MB-MM-G0-G1-G2-G3-G4-G5-G6-G7-G8-G9-GX -United States;US;K0-K1-K2-K3-K4-K5-K6-K7-K8-K9-KA-KB-KC-KD-KE-KF-KI-KJ-KM-W0-W1-W2-W3-W4-W5-W6-W7-W8-W9-WA-WB-WX-N0-N1-N2-N3-N4-N5-N6-N7-N8-N9-NS-NO-AA-AB-AC-AD-AE-AF-AG-AH-AI-AJ-AK +United States;US;K0-K1-K2-K3-K4-K5-K6-K7-K8-K9-KA-KB-KC-KD-KE-KF-KG-KI-KJ-KK-KM-KN-KO-KQ-KR-KS-KT-KU-KV-KW-KX-KY-KZ-W0-W1-W2-W3-W4-W5-W6-W7-W8-W9-WA-WB-WD-WX-N0-N1-N2-N3-N4-N5-N6-N7-N8-N9-NS-NO-AA-AB-AC-AD-AE-AF-AG-AH-AI-AJ-AK United States Minor Outlying Islands;UM; Uruguay;UY;CV-CW-CX Uzbekistan;UZ;UJ-UK-UL-UM diff --git a/src/cclient.h b/src/cclient.h index 528a1ec..32f8796 100644 --- a/src/cclient.h +++ b/src/cclient.h @@ -68,6 +68,8 @@ public: virtual const char *GetProtocolName(void) const { return "none"; } virtual bool IsNode(void) const { return false; } virtual bool IsPeer(void) const { return false; } + virtual bool IsDextraDongle(void) const { return false; } + virtual void SetDextraDongle(void) { } // status virtual void Alive(void); diff --git a/src/cdcsprotocol.cpp b/src/cdcsprotocol.cpp index 3c27def..0765c24 100644 --- a/src/cdcsprotocol.cpp +++ b/src/cdcsprotocol.cpp @@ -127,7 +127,7 @@ void CDcsProtocol::Task(void) if ( g_GateKeeper.MayLink(Callsign, Ip, PROTOCOL_DCS) ) { // acknowledge the request - EncodeConnectAckPacket(Callsign, &Buffer); + EncodeConnectAckPacket(Callsign, ToLinkModule, &Buffer); m_Socket.Send(Buffer, Ip); // create the client @@ -140,7 +140,7 @@ void CDcsProtocol::Task(void) else { // deny the request - EncodeConnectNackPacket(Callsign, &Buffer); + EncodeConnectNackPacket(Callsign, ToLinkModule, &Buffer); m_Socket.Send(Buffer, Ip); } @@ -172,9 +172,15 @@ void CDcsProtocol::Task(void) } g_Reflector.ReleaseClients(); } + else if ( IsIgnorePacket(Buffer) ) + { + // valid but ignore packet + //std::cout << "DCS ignored packet from " << Ip << std::endl; + } else { - std::cout << "DCS packet (" << Buffer.size() << ")" << std::endl; + // invalid packet + std::cout << "DCS packet (" << Buffer.size() << ") from " << Ip << std::endl; } } @@ -390,7 +396,7 @@ bool CDcsProtocol::IsValidDisconnectPacket(const CBuffer &Buffer, CCallsign *cal bool CDcsProtocol::IsValidKeepAlivePacket(const CBuffer &Buffer, CCallsign *callsign) { bool valid = false; - if (Buffer.size() == 17) + if ( (Buffer.size() == 17) || (Buffer.size() == 15) || (Buffer.size() == 22) ) { callsign->SetCallsign(Buffer.data(), 8); valid = callsign->IsValid(); @@ -443,6 +449,18 @@ bool CDcsProtocol::IsValidDvPacket(const CBuffer &Buffer, CDvHeaderPacket **head return valid; } +bool CDcsProtocol::IsIgnorePacket(const CBuffer &Buffer) +{ + bool valid = false; + uint8 tag[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; + + if ( Buffer.size() == 15 ) + { + valid = (Buffer.Compare(tag, sizeof(tag)) == 0); + } + return valid; +} + //////////////////////////////////////////////////////////////////////////////////////// // packet encoding helpers @@ -454,35 +472,40 @@ void CDcsProtocol::EncodeKeepAlivePacket(CBuffer *Buffer) void CDcsProtocol::EncodeKeepAlivePacket(CBuffer *Buffer, CClient *Client) { + uint8 tag[] = { 0x0A,0x00,0x20,0x20 }; + Buffer->Set((uint8 *)(const char *)GetReflectorCallsign(), CALLSIGN_LEN-1); Buffer->Append((uint8)Client->GetReflectorModule()); - Buffer->Append((uint8)0); - Buffer->Append((uint8 *)(const char *)Client->GetCallsign(), CALLSIGN_LEN); - Buffer->Append((uint8)Client->GetModule()); - Buffer->Append((uint8)0, 4); -} - -void CDcsProtocol::EncodeConnectAckPacket(const CCallsign &Callsign, CBuffer *Buffer) -{ - uint8 tag[] = { 'E','A','C','K',0x00 }; - uint8 cs[CALLSIGN_LEN]; - - Callsign.GetCallsign(cs); - Buffer->Set(cs, CALLSIGN_LEN-1); Buffer->Append((uint8)' '); - Buffer->Append((uint8)Callsign.GetModule()); + Buffer->Append((uint8 *)(const char *)Client->GetCallsign(), CALLSIGN_LEN-1); + Buffer->Append((uint8)Client->GetModule()); + Buffer->Append((uint8)Client->GetModule()); Buffer->Append(tag, sizeof(tag)); } -void CDcsProtocol::EncodeConnectNackPacket(const CCallsign &Callsign, CBuffer *Buffer) +void CDcsProtocol::EncodeConnectAckPacket(const CCallsign &Callsign, char ReflectorModule, CBuffer *Buffer) { - uint8 tag[] = { 'E','N','A','K',0x00 }; + uint8 tag[] = { 'A','C','K',0x00 }; uint8 cs[CALLSIGN_LEN]; Callsign.GetCallsign(cs); Buffer->Set(cs, CALLSIGN_LEN-1); Buffer->Append((uint8)' '); Buffer->Append((uint8)Callsign.GetModule()); + Buffer->Append((uint8)ReflectorModule); + Buffer->Append(tag, sizeof(tag)); +} + +void CDcsProtocol::EncodeConnectNackPacket(const CCallsign &Callsign, char ReflectorModule, CBuffer *Buffer) +{ + uint8 tag[] = { 'N','A','K',0x00 }; + uint8 cs[CALLSIGN_LEN]; + + Callsign.GetCallsign(cs); + Buffer->Set(cs, CALLSIGN_LEN-1); + Buffer->Append((uint8)' '); + Buffer->Append((uint8)Callsign.GetModule()); + Buffer->Append((uint8)ReflectorModule); Buffer->Append(tag, sizeof(tag)); } diff --git a/src/cdcsprotocol.h b/src/cdcsprotocol.h index dba1637..b356db3 100644 --- a/src/cdcsprotocol.h +++ b/src/cdcsprotocol.h @@ -67,12 +67,13 @@ protected: bool IsValidDisconnectPacket(const CBuffer &, CCallsign *); bool IsValidKeepAlivePacket(const CBuffer &, CCallsign *); bool IsValidDvPacket(const CBuffer &, CDvHeaderPacket **, CDvFramePacket **); + bool IsIgnorePacket(const CBuffer &); // packet encoding helpers void EncodeKeepAlivePacket(CBuffer *); void EncodeKeepAlivePacket(CBuffer *, CClient *); - void EncodeConnectAckPacket(const CCallsign &, CBuffer *); - void EncodeConnectNackPacket(const CCallsign &, CBuffer *); + void EncodeConnectAckPacket(const CCallsign &, char, CBuffer *); + void EncodeConnectNackPacket(const CCallsign &, char, CBuffer *); void EncodeDisconnectPacket(CBuffer *, CClient *); void EncodeDvPacket(const CDvHeaderPacket &, const CDvFramePacket &, uint32, CBuffer *) const; void EncodeDvLastPacket(const CDvHeaderPacket &, const CDvFramePacket &, uint32, CBuffer *) const; diff --git a/src/cdplusclient.cpp b/src/cdplusclient.cpp index e5a09ae..19f59c3 100644 --- a/src/cdplusclient.cpp +++ b/src/cdplusclient.cpp @@ -31,16 +31,19 @@ CDplusClient::CDplusClient() { + m_bDextraDongle = false; } CDplusClient::CDplusClient(const CCallsign &callsign, const CIp &ip, char reflectorModule) : CClient(callsign, ip, reflectorModule) { + m_bDextraDongle = false; } CDplusClient::CDplusClient(const CDplusClient &client) : CClient(client) { + m_bDextraDongle = client.m_bDextraDongle; } //////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/cdplusclient.h b/src/cdplusclient.h index 5d7a630..389a228 100644 --- a/src/cdplusclient.h +++ b/src/cdplusclient.h @@ -49,10 +49,16 @@ public: int GetProtocol(void) const { return PROTOCOL_DPLUS; } const char *GetProtocolName(void) const { return "Dplus"; } bool IsNode(void) const { return true; } + bool IsDextraDongle(void) const { return m_bDextraDongle; } + void SetDextraDongle(void) { m_bDextraDongle = true; } // status bool IsAlive(void) const; void SetMasterOfModule(char); + +protected: + // data + bool m_bDextraDongle; }; //////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/cdplusprotocol.cpp b/src/cdplusprotocol.cpp index 869e284..03427c5 100644 --- a/src/cdplusprotocol.cpp +++ b/src/cdplusprotocol.cpp @@ -41,8 +41,8 @@ bool CDplusProtocol::Init(void) ok = CProtocol::Init(); // update the reflector callsign - //m_ReflectorCallsign.PatchCallsign(0, (const uint8 *)"REF", 3); - m_ReflectorCallsign.PatchCallsign(0, (const uint8 *)"XRF", 3); + m_ReflectorCallsign.PatchCallsign(0, (const uint8 *)"REF", 3); + //m_ReflectorCallsign.PatchCallsign(0, (const uint8 *)"XRF", 3); // create our socket ok &= m_Socket.Open(DPLUS_PORT); @@ -202,10 +202,15 @@ bool CDplusProtocol::OnDvHeaderPacketIn(CDvHeaderPacket *Header, const CIp &Ip) // no stream open yet, open a new one CCallsign via(Header->GetRpt1Callsign()); - // find this client + // find this client CClient *client = g_Reflector.GetClients()->FindClient(Ip, PROTOCOL_DPLUS); if ( client != NULL ) { + // now we knwo if it's a dextra dongle or a genuine dplus node + if ( Header->GetRpt2Callsign().HasSameCallsignWithWidlcard(CCallsign("XRF*")) ) + { + client->SetDextraDongle(); + } // now we know its module, let's update it if ( !client->HasModule() ) { @@ -268,9 +273,35 @@ void CDplusProtocol::HandleQueue(void) // is this client busy ? if ( !client->IsAMaster() ) { - // no, send the packet - m_Socket.Send(buffer, client->GetIp()); - + // check if client is a dextra dongle + // then replace RPT2 with XRF instead of REF + // if the client type is not yet known, send bothheaders + if ( packet->IsDvHeader() && (client->IsDextraDongle() || !client->HasModule()) ) + { + // clone the packet and patch it + CDvHeaderPacket packet2(*((CDvHeaderPacket *)packet)); + CCallsign rpt2 = packet2.GetRpt2Callsign(); + rpt2.PatchCallsign(0, (const uint8 *)"XRF", 3); + packet2.SetRpt2Callsign(rpt2); + // encode it + CBuffer buffer2; + if ( EncodeDvPacket(packet2, &buffer2) ) + { + // and send it + m_Socket.Send(buffer2, client->GetIp()); + } + // client type known ? + if ( !client->HasModule() ) + { + // no, send also the genuine packet + m_Socket.Send(buffer, client->GetIp()); + } + } + else + { + // no, send the original packet + m_Socket.Send(buffer, client->GetIp()); + } } } g_Reflector.ReleaseClients(); diff --git a/src/main.h b/src/main.h index 3682f28..be097f2 100644 --- a/src/main.h +++ b/src/main.h @@ -48,7 +48,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 -#define VERSION_REVISION 1 +#define VERSION_REVISION 4 // global ------------------------------------------------------