From 7f0b9aae89302808530911d37171d4bc2b034ad4 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 27 Mar 2018 08:13:54 +0100 Subject: [PATCH] A number of major and minor fixes. --- NXDNGateway/Conf.cpp | 4 +- NXDNGateway/Conf.h | 36 ++++++------- NXDNGateway/NXDNGateway.cpp | 30 +++++------ NXDNGateway/NXDNNetwork.cpp | 24 +++++---- NXDNGateway/NXDNNetwork.h | 4 +- NXDNGateway/Reflectors.cpp | 6 +-- NXDNGateway/Reflectors.h | 10 ++-- NXDNParrot/Makefile | 2 +- NXDNParrot/{Network.cpp => NXDNNetwork.cpp} | 18 +++---- NXDNParrot/{Network.h => NXDNNetwork.h} | 10 ++-- NXDNParrot/NXDNParrot.cpp | 8 +-- NXDNParrot/NXDNParrot.vcxproj | 4 +- NXDNParrot/NXDNParrot.vcxproj.filters | 12 ++--- NXDNReflector/NXDNNetwork.cpp | 2 +- NXDNReflector/NXDNReflector.cpp | 58 ++++++++++++--------- 15 files changed, 120 insertions(+), 108 deletions(-) rename NXDNParrot/{Network.cpp => NXDNNetwork.cpp} (79%) rename NXDNParrot/{Network.h => NXDNNetwork.h} (90%) diff --git a/NXDNGateway/Conf.cpp b/NXDNGateway/Conf.cpp index 56762a1..3b10d1c 100644 --- a/NXDNGateway/Conf.cpp +++ b/NXDNGateway/Conf.cpp @@ -150,7 +150,7 @@ bool CConf::read() else if (::strcmp(key, "ParrotPort") == 0) m_networkParrotPort = (unsigned int)::atoi(value); else if (::strcmp(key, "Startup") == 0) - m_networkStartup = (unsigned int)::atoi(value); + m_networkStartup = (unsigned short)::atoi(value); else if (::strcmp(key, "InactivityTimeout") == 0) m_networkInactivityTimeout = (unsigned int)::atoi(value); else if (::strcmp(key, "Debug") == 0) @@ -258,7 +258,7 @@ unsigned int CConf::getNetworkParrotPort() const return m_networkParrotPort; } -unsigned int CConf::getNetworkStartup() const +unsigned short CConf::getNetworkStartup() const { return m_networkStartup; } diff --git a/NXDNGateway/Conf.h b/NXDNGateway/Conf.h index 9323e7d..17dfb74 100644 --- a/NXDNGateway/Conf.h +++ b/NXDNGateway/Conf.h @@ -52,15 +52,15 @@ public: std::string getLogFileRoot() const; // The Network section - unsigned int getNetworkPort() const; - std::string getNetworkHosts1() const; - std::string getNetworkHosts2() const; - unsigned int getNetworkReloadTime() const; - std::string getNetworkParrotAddress() const; - unsigned int getNetworkParrotPort() const; - unsigned int getNetworkStartup() const; - unsigned int getNetworkInactivityTimeout() const; - bool getNetworkDebug() const; + unsigned int getNetworkPort() const; + std::string getNetworkHosts1() const; + std::string getNetworkHosts2() const; + unsigned int getNetworkReloadTime() const; + std::string getNetworkParrotAddress() const; + unsigned int getNetworkParrotPort() const; + unsigned short getNetworkStartup() const; + unsigned int getNetworkInactivityTimeout() const; + bool getNetworkDebug() const; private: std::string m_file; @@ -81,15 +81,15 @@ private: std::string m_logFilePath; std::string m_logFileRoot; - unsigned int m_networkPort; - std::string m_networkHosts1; - std::string m_networkHosts2; - unsigned int m_networkReloadTime; - std::string m_networkParrotAddress; - unsigned int m_networkParrotPort; - unsigned int m_networkStartup; - unsigned int m_networkInactivityTimeout; - bool m_networkDebug; + unsigned int m_networkPort; + std::string m_networkHosts1; + std::string m_networkHosts2; + unsigned int m_networkReloadTime; + std::string m_networkParrotAddress; + unsigned int m_networkParrotPort; + unsigned short m_networkStartup; + unsigned int m_networkInactivityTimeout; + bool m_networkDebug; }; #endif diff --git a/NXDNGateway/NXDNGateway.cpp b/NXDNGateway/NXDNGateway.cpp index d44ba48..dc9939b 100644 --- a/NXDNGateway/NXDNGateway.cpp +++ b/NXDNGateway/NXDNGateway.cpp @@ -212,11 +212,11 @@ void CNXDNGateway::run() unsigned short dstId = 0U; bool grp = false; - unsigned int currentId = 9999U; + unsigned short currentId = 9999U; in_addr currentAddr; unsigned int currentPort = 0U; - unsigned int id = m_conf.getNetworkStartup(); + unsigned short id = m_conf.getNetworkStartup(); if (id != 9999U) { CNXDNReflector* reflector = reflectors.find(id); if (reflector != NULL) { @@ -228,9 +228,9 @@ void CNXDNGateway::run() pollTimer.start(); lostTimer.start(); - remoteNetwork.writePoll(currentAddr, currentPort); - remoteNetwork.writePoll(currentAddr, currentPort); - remoteNetwork.writePoll(currentAddr, currentPort); + remoteNetwork.writePoll(currentAddr, currentPort, currentId); + remoteNetwork.writePoll(currentAddr, currentPort, currentId); + remoteNetwork.writePoll(currentAddr, currentPort, currentId); LogMessage("Linked at startup to reflector %u", currentId); } @@ -290,9 +290,9 @@ void CNXDNGateway::run() if (voice != NULL && dstId == 9999U) voice->unlinked(); - remoteNetwork.writeUnlink(currentAddr, currentPort); - remoteNetwork.writeUnlink(currentAddr, currentPort); - remoteNetwork.writeUnlink(currentAddr, currentPort); + remoteNetwork.writeUnlink(currentAddr, currentPort, currentId); + remoteNetwork.writeUnlink(currentAddr, currentPort, currentId); + remoteNetwork.writeUnlink(currentAddr, currentPort, currentId); inactivityTimer.stop(); pollTimer.stop(); @@ -314,9 +314,9 @@ void CNXDNGateway::run() if (voice != NULL) voice->linkedTo(currentId); - remoteNetwork.writePoll(currentAddr, currentPort); - remoteNetwork.writePoll(currentAddr, currentPort); - remoteNetwork.writePoll(currentAddr, currentPort); + remoteNetwork.writePoll(currentAddr, currentPort, currentId); + remoteNetwork.writePoll(currentAddr, currentPort, currentId); + remoteNetwork.writePoll(currentAddr, currentPort, currentId); inactivityTimer.start(); pollTimer.start(); @@ -357,9 +357,9 @@ void CNXDNGateway::run() if (currentId != 9999U) { LogMessage("Unlinking from %u due to inactivity", currentId); - remoteNetwork.writeUnlink(currentAddr, currentPort); - remoteNetwork.writeUnlink(currentAddr, currentPort); - remoteNetwork.writeUnlink(currentAddr, currentPort); + remoteNetwork.writeUnlink(currentAddr, currentPort, currentId); + remoteNetwork.writeUnlink(currentAddr, currentPort, currentId); + remoteNetwork.writeUnlink(currentAddr, currentPort, currentId); if (voice != NULL) voice->unlinked(); @@ -375,7 +375,7 @@ void CNXDNGateway::run() pollTimer.clock(ms); if (pollTimer.isRunning() && pollTimer.hasExpired()) { if (currentId != 9999U) - remoteNetwork.writePoll(currentAddr, currentPort); + remoteNetwork.writePoll(currentAddr, currentPort, currentId); pollTimer.start(); } diff --git a/NXDNGateway/NXDNNetwork.cpp b/NXDNGateway/NXDNNetwork.cpp index b1b09a0..8eaecae 100644 --- a/NXDNGateway/NXDNNetwork.cpp +++ b/NXDNGateway/NXDNNetwork.cpp @@ -79,7 +79,7 @@ bool CNXDNNetwork::writeData(const unsigned char* data, unsigned int length, uns return m_socket.write(buffer, 43U, address, port); } -bool CNXDNNetwork::writePoll(const in_addr& address, unsigned int port) +bool CNXDNNetwork::writePoll(const in_addr& address, unsigned int port, unsigned short tg) { assert(port > 0U); @@ -94,13 +94,16 @@ bool CNXDNNetwork::writePoll(const in_addr& address, unsigned int port) for (unsigned int i = 0U; i < 10U; i++) data[i + 5U] = m_callsign.at(i); - if (m_debug) - CUtils::dump(1U, "NXDN Network Poll Sent", data, 15U); + data[15U] = (tg >> 8) & 0xFFU; + data[16U] = (tg >> 0) & 0xFFU; - return m_socket.write(data, 15U, address, port); + if (m_debug) + CUtils::dump(1U, "NXDN Network Poll Sent", data, 17U); + + return m_socket.write(data, 17U, address, port); } -bool CNXDNNetwork::writeUnlink(const in_addr& address, unsigned int port) +bool CNXDNNetwork::writeUnlink(const in_addr& address, unsigned int port, unsigned short tg) { assert(port > 0U); @@ -115,10 +118,13 @@ bool CNXDNNetwork::writeUnlink(const in_addr& address, unsigned int port) for (unsigned int i = 0U; i < 10U; i++) data[i + 5U] = m_callsign.at(i); - if (m_debug) - CUtils::dump(1U, "NXDN Network Unlink Sent", data, 15U); + data[15U] = (tg >> 8) & 0xFFU; + data[16U] = (tg >> 0) & 0xFFU; - return m_socket.write(data, 15U, address, port); + if (m_debug) + CUtils::dump(1U, "NXDN Network Unlink Sent", data, 17U); + + return m_socket.write(data, 17U, address, port); } unsigned int CNXDNNetwork::readData(unsigned char* data, unsigned int length, in_addr& address, unsigned int& port) @@ -130,7 +136,7 @@ unsigned int CNXDNNetwork::readData(unsigned char* data, unsigned int length, in if (len <= 0) return 0U; - if ((::memcmp(data, "NXDNP", 5U) == 0 && len == 15) || (::memcmp(data, "NXDND", 5U) == 0 && len == 43)) { + if ((::memcmp(data, "NXDNP", 5U) == 0 && len == 17) || (::memcmp(data, "NXDND", 5U) == 0 && len == 43)) { if (m_debug) CUtils::dump(1U, "NXDN Network Data Received", data, len); diff --git a/NXDNGateway/NXDNNetwork.h b/NXDNGateway/NXDNNetwork.h index 690b9ed..a2fa25e 100644 --- a/NXDNGateway/NXDNNetwork.h +++ b/NXDNGateway/NXDNNetwork.h @@ -33,9 +33,9 @@ public: bool writeData(const unsigned char* data, unsigned int length, unsigned short srcId, unsigned short dstId, bool grp, const in_addr& address, unsigned int port); - bool writePoll(const in_addr& address, unsigned int port); + bool writePoll(const in_addr& address, unsigned int port, unsigned short tg); - bool writeUnlink(const in_addr& address, unsigned int port); + bool writeUnlink(const in_addr& address, unsigned int port, unsigned short tg); unsigned int readData(unsigned char* data, unsigned int length, in_addr& address, unsigned int& port); diff --git a/NXDNGateway/Reflectors.cpp b/NXDNGateway/Reflectors.cpp index dc8a1ed..6ba082b 100644 --- a/NXDNGateway/Reflectors.cpp +++ b/NXDNGateway/Reflectors.cpp @@ -77,7 +77,7 @@ bool CReflectors::load() in_addr address = CUDPSocket::lookup(host); if (address.s_addr != INADDR_NONE) { CNXDNReflector* refl = new CNXDNReflector; - refl->m_id = (unsigned int)::atoi(p1); + refl->m_id = (unsigned short)::atoi(p1); refl->m_address = address; refl->m_port = (unsigned int)::atoi(p3); @@ -106,7 +106,7 @@ bool CReflectors::load() in_addr address = CUDPSocket::lookup(host); if (address.s_addr != INADDR_NONE) { CNXDNReflector* refl = new CNXDNReflector; - refl->m_id = (unsigned int)::atoi(p1); + refl->m_id = (unsigned short)::atoi(p1); refl->m_address = address; refl->m_port = (unsigned int)::atoi(p3); @@ -138,7 +138,7 @@ bool CReflectors::load() return true; } -CNXDNReflector* CReflectors::find(unsigned int id) +CNXDNReflector* CReflectors::find(unsigned short id) { for (std::vector::iterator it = m_reflectors.begin(); it != m_reflectors.end(); ++it) { if (id == (*it)->m_id) diff --git a/NXDNGateway/Reflectors.h b/NXDNGateway/Reflectors.h index 3687ff1..d7343b6 100644 --- a/NXDNGateway/Reflectors.h +++ b/NXDNGateway/Reflectors.h @@ -28,15 +28,15 @@ class CNXDNReflector { public: CNXDNReflector() : - m_id(), + m_id(0U), m_address(), m_port(0U) { } - unsigned int m_id; - in_addr m_address; - unsigned int m_port; + unsigned short m_id; + in_addr m_address; + unsigned int m_port; }; class CReflectors { @@ -48,7 +48,7 @@ public: bool load(); - CNXDNReflector* find(unsigned int id); + CNXDNReflector* find(unsigned short id); void clock(unsigned int ms); diff --git a/NXDNParrot/Makefile b/NXDNParrot/Makefile index a8403e6..9a4b426 100644 --- a/NXDNParrot/Makefile +++ b/NXDNParrot/Makefile @@ -4,7 +4,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x -pthread LIBS = -lpthread LDFLAGS = -g -OBJECTS = Network.o NXDNParrot.o Parrot.o StopWatch.o Thread.o Timer.o UDPSocket.o +OBJECTS = NXDNNetwork.o NXDNParrot.o Parrot.o StopWatch.o Thread.o Timer.o UDPSocket.o all: NXDNParrot diff --git a/NXDNParrot/Network.cpp b/NXDNParrot/NXDNNetwork.cpp similarity index 79% rename from NXDNParrot/Network.cpp rename to NXDNParrot/NXDNNetwork.cpp index 6942556..21c2531 100644 --- a/NXDNParrot/Network.cpp +++ b/NXDNParrot/NXDNNetwork.cpp @@ -16,31 +16,31 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "Network.h" +#include "NXDNNetwork.h" #include #include #include -CNetwork::CNetwork(unsigned int port) : +CNXDNNetwork::CNXDNNetwork(unsigned int port) : m_socket(port), m_address(), m_port(0U) { } -CNetwork::~CNetwork() +CNXDNNetwork::~CNXDNNetwork() { } -bool CNetwork::open() +bool CNXDNNetwork::open() { ::fprintf(stdout, "Opening NXDN network connection\n"); return m_socket.open(); } -bool CNetwork::write(const unsigned char* data, unsigned int length) +bool CNXDNNetwork::write(const unsigned char* data, unsigned int length) { if (m_port == 0U) return true; @@ -50,7 +50,7 @@ bool CNetwork::write(const unsigned char* data, unsigned int length) return m_socket.write(data, length, m_address, m_port); } -unsigned int CNetwork::read(unsigned char* data, unsigned int len) +unsigned int CNXDNNetwork::read(unsigned char* data, unsigned int len) { in_addr address; unsigned int port; @@ -61,7 +61,7 @@ unsigned int CNetwork::read(unsigned char* data, unsigned int len) m_address.s_addr = address.s_addr; m_port = port; - if (::memcmp(data, "NXDNP", 5U) == 0 && length == 15) { // A poll + if (::memcmp(data, "NXDNP", 5U) == 0 && length == 17) { // A poll write(data, length); return 0U; } else if (::memcmp(data, "NXDND", 5U) == 0 && length == 43) { @@ -71,12 +71,12 @@ unsigned int CNetwork::read(unsigned char* data, unsigned int len) } } -void CNetwork::end() +void CNXDNNetwork::end() { m_port = 0U; } -void CNetwork::close() +void CNXDNNetwork::close() { m_socket.close(); diff --git a/NXDNParrot/Network.h b/NXDNParrot/NXDNNetwork.h similarity index 90% rename from NXDNParrot/Network.h rename to NXDNParrot/NXDNNetwork.h index d9cc008..c903b3f 100644 --- a/NXDNParrot/Network.h +++ b/NXDNParrot/NXDNNetwork.h @@ -16,18 +16,18 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifndef Network_H -#define Network_H +#ifndef NXDNNetwork_H +#define NXDNNetwork_H #include "UDPSocket.h" #include #include -class CNetwork { +class CNXDNNetwork { public: - CNetwork(unsigned int port); - ~CNetwork(); + CNXDNNetwork(unsigned int port); + ~CNXDNNetwork(); bool open(); diff --git a/NXDNParrot/NXDNParrot.cpp b/NXDNParrot/NXDNParrot.cpp index c26bbb1..d9db5e7 100644 --- a/NXDNParrot/NXDNParrot.cpp +++ b/NXDNParrot/NXDNParrot.cpp @@ -16,11 +16,11 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#include "StopWatch.h" +#include "NXDNNetwork.h" #include "NXDNParrot.h" -#include "Parrot.h" -#include "Network.h" +#include "StopWatch.h" #include "Version.h" +#include "Parrot.h" #include "Thread.h" #include "Timer.h" @@ -59,7 +59,7 @@ CNXDNParrot::~CNXDNParrot() void CNXDNParrot::run() { CParrot parrot(180U); - CNetwork network(m_port); + CNXDNNetwork network(m_port); bool ret = network.open(); if (!ret) diff --git a/NXDNParrot/NXDNParrot.vcxproj b/NXDNParrot/NXDNParrot.vcxproj index ada9a49..053937b 100644 --- a/NXDNParrot/NXDNParrot.vcxproj +++ b/NXDNParrot/NXDNParrot.vcxproj @@ -146,7 +146,7 @@ - + @@ -156,7 +156,7 @@ - + diff --git a/NXDNParrot/NXDNParrot.vcxproj.filters b/NXDNParrot/NXDNParrot.vcxproj.filters index a02a136..e82e908 100644 --- a/NXDNParrot/NXDNParrot.vcxproj.filters +++ b/NXDNParrot/NXDNParrot.vcxproj.filters @@ -11,9 +11,6 @@ - - Header Files - Header Files @@ -35,11 +32,11 @@ Header Files + + Header Files + - - Source Files - Source Files @@ -58,5 +55,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/NXDNReflector/NXDNNetwork.cpp b/NXDNReflector/NXDNNetwork.cpp index 33b455f..9433f3e 100644 --- a/NXDNReflector/NXDNNetwork.cpp +++ b/NXDNReflector/NXDNNetwork.cpp @@ -102,7 +102,7 @@ unsigned int CNXDNNetwork::read(unsigned char* data, unsigned int length, in_add if (::memcmp(data, "NXDN", 4U) != 0) return 0U; - if (len != 15 && len != 43) + if (len != 17 && len != 43) return 0U; if (m_debug) diff --git a/NXDNReflector/NXDNReflector.cpp b/NXDNReflector/NXDNReflector.cpp index 060c76e..770316c 100644 --- a/NXDNReflector/NXDNReflector.cpp +++ b/NXDNReflector/NXDNReflector.cpp @@ -214,35 +214,41 @@ void CNXDNReflector::run() if (len > 0U) { CNXDNRepeater* rpt = findRepeater(address, port); - if (::memcmp(buffer, "NXDNP", 5U) == 0 && len == 15U) { - if (rpt == NULL) { - rpt = new CNXDNRepeater; - rpt->m_timer.start(); - rpt->m_address = address; - rpt->m_port = port; - rpt->m_callsign = std::string((char*)(buffer + 5U), 10U); - m_repeaters.push_back(rpt); + if (::memcmp(buffer, "NXDNP", 5U) == 0 && len == 17U) { + unsigned short id = (buffer[15U] << 8) | buffer[16U]; + if (id == tg) { + if (rpt == NULL) { + rpt = new CNXDNRepeater; + rpt->m_timer.start(); + rpt->m_address = address; + rpt->m_port = port; + rpt->m_callsign = std::string((char*)(buffer + 5U), 10U); + m_repeaters.push_back(rpt); - LogMessage("Adding %s (%s:%u)", rpt->m_callsign.c_str(), ::inet_ntoa(address), port); - } else { - rpt->m_timer.start(); - } - - // Return the poll - nxdnNetwork.write(buffer, len, address, port); - } else if (::memcmp(buffer, "NXDNU", 5U) == 0 && len == 15U) { - if (rpt != NULL) { - std::string callsign = std::string((char*)(buffer + 5U), 10U); - LogMessage("Removing %s (%s:%u)", callsign.c_str(), ::inet_ntoa(address), port); - - for (std::vector::iterator it = m_repeaters.begin(); it != m_repeaters.end(); ++it) { - if (*it == rpt) { - m_repeaters.erase(it); - break; - } + LogMessage("Adding %s (%s:%u)", rpt->m_callsign.c_str(), ::inet_ntoa(address), port); + } else { + rpt->m_timer.start(); } - delete rpt; + // Return the poll + nxdnNetwork.write(buffer, len, address, port); + } + } else if (::memcmp(buffer, "NXDNU", 5U) == 0 && len == 17U) { + unsigned short id = (buffer[15U] << 8) | buffer[16U]; + if (id == tg) { + if (rpt != NULL) { + std::string callsign = std::string((char*)(buffer + 5U), 10U); + LogMessage("Removing %s (%s:%u)", callsign.c_str(), ::inet_ntoa(address), port); + + for (std::vector::iterator it = m_repeaters.begin(); it != m_repeaters.end(); ++it) { + if (*it == rpt) { + m_repeaters.erase(it); + break; + } + } + + delete rpt; + } } } else if (::memcmp(buffer, "NXDND", 5U) == 0 && len == 43U) { if (rpt != NULL) {