From 022d1a768b1ebf3f37ea79c6ac678d3870edba5f Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Fri, 27 Mar 2020 06:25:54 +0900 Subject: [PATCH 01/10] add IPv6 support (code from DAPNETGateway-IPv6) --- UDPSocket.cpp | 115 ++++++++++++++++++-------------------------------- UDPSocket.h | 9 ++-- 2 files changed, 47 insertions(+), 77 deletions(-) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index ba0e35f..7899601 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -60,49 +60,46 @@ CUDPSocket::~CUDPSocket() #endif } -in_addr CUDPSocket::lookup(const std::string& hostname) +int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_storage &addr, unsigned int &address_length) { - in_addr addr; -#if defined(_WIN32) || defined(_WIN64) - unsigned long address = ::inet_addr(hostname.c_str()); - if (address != INADDR_NONE && address != INADDR_ANY) { - addr.s_addr = address; - return addr; + int err; + std::string portstr = std::to_string(port); + struct addrinfo hints, *res; + + ::memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_flags = AI_NUMERICSERV; + + err = getaddrinfo(hostname.c_str(), portstr.c_str(), &hints, &res); + if (err) { + sockaddr_in *paddr = (sockaddr_in *)&addr; + ::memset(paddr, 0, address_length = sizeof(sockaddr_in)); + paddr->sin_family = AF_INET; + paddr->sin_port = htons(port); + paddr->sin_addr.s_addr = htonl(INADDR_NONE); + LogError("Cannot find address for host %s", hostname.c_str()); + return err; } - struct hostent* hp = ::gethostbyname(hostname.c_str()); - if (hp != NULL) { - ::memcpy(&addr, hp->h_addr_list[0], sizeof(struct in_addr)); - return addr; - } + ::memcpy(&addr, res->ai_addr, address_length = res->ai_addrlen); - LogError("Cannot find address for host %s", hostname.c_str()); - - addr.s_addr = INADDR_NONE; - return addr; -#else - in_addr_t address = ::inet_addr(hostname.c_str()); - if (address != in_addr_t(-1)) { - addr.s_addr = address; - return addr; - } - - struct hostent* hp = ::gethostbyname(hostname.c_str()); - if (hp != NULL) { - ::memcpy(&addr, hp->h_addr_list[0], sizeof(struct in_addr)); - return addr; - } - - LogError("Cannot find address for host %s", hostname.c_str()); - - addr.s_addr = INADDR_NONE; - return addr; -#endif + freeaddrinfo(res); + return 0; } bool CUDPSocket::open() { - m_fd = ::socket(PF_INET, SOCK_DGRAM, 0); + int err; + sockaddr_storage addr; + unsigned int addrlen; + + /* to determine protocol family, call lookup() first. */ + err = lookup(m_address.empty() ? "0.0.0.0" : m_address.c_str(), m_port, addr, addrlen); + if (err) { + LogError("The local address is invalid - %s", m_address.c_str()); + return false; + } + + m_fd = ::socket(addr.ss_family, SOCK_DGRAM, 0); if (m_fd < 0) { #if defined(_WIN32) || defined(_WIN64) LogError("Cannot create the UDP socket, err: %lu", ::GetLastError()); @@ -113,24 +110,6 @@ bool CUDPSocket::open() } if (m_port > 0U) { - sockaddr_in addr; - ::memset(&addr, 0x00, sizeof(sockaddr_in)); - addr.sin_family = AF_INET; - addr.sin_port = htons(m_port); - addr.sin_addr.s_addr = htonl(INADDR_ANY); - - if (!m_address.empty()) { -#if defined(_WIN32) || defined(_WIN64) - addr.sin_addr.s_addr = ::inet_addr(m_address.c_str()); -#else - addr.sin_addr.s_addr = ::inet_addr(m_address.c_str()); -#endif - if (addr.sin_addr.s_addr == INADDR_NONE) { - LogError("The local address is invalid - %s", m_address.c_str()); - return false; - } - } - int reuse = 1; if (::setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) == -1) { #if defined(_WIN32) || defined(_WIN64) @@ -141,7 +120,7 @@ bool CUDPSocket::open() return false; } - if (::bind(m_fd, (sockaddr*)&addr, sizeof(sockaddr_in)) == -1) { + if (::bind(m_fd, (sockaddr*)&addr, addrlen) == -1) { #if defined(_WIN32) || defined(_WIN64) LogError("Cannot bind the UDP address, err: %lu", ::GetLastError()); #else @@ -154,7 +133,7 @@ bool CUDPSocket::open() return true; } -int CUDPSocket::read(unsigned char* buffer, unsigned int length, in_addr& address, unsigned int& port) +int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length) { assert(buffer != NULL); assert(length > 0U); @@ -186,17 +165,16 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, in_addr& addres if (ret == 0) return 0; - sockaddr_in addr; #if defined(_WIN32) || defined(_WIN64) - int size = sizeof(sockaddr_in); + int size = sizeof(sockaddr_storage); #else - socklen_t size = sizeof(sockaddr_in); + socklen_t size = sizeof(sockaddr_storage); #endif #if defined(_WIN32) || defined(_WIN64) - int len = ::recvfrom(m_fd, (char*)buffer, length, 0, (sockaddr *)&addr, &size); + int len = ::recvfrom(m_fd, (char*)buffer, length, 0, (sockaddr *)&address, &size); #else - ssize_t len = ::recvfrom(m_fd, (char*)buffer, length, 0, (sockaddr *)&addr, &size); + ssize_t len = ::recvfrom(m_fd, (char*)buffer, length, 0, (sockaddr *)&address, &size); #endif if (len <= 0) { #if defined(_WIN32) || defined(_WIN64) @@ -207,28 +185,19 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, in_addr& addres return -1; } - address = addr.sin_addr; - port = ntohs(addr.sin_port); - + address_length = size; return len; } -bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const in_addr& address, unsigned int port) +bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length) { assert(buffer != NULL); assert(length > 0U); - sockaddr_in addr; - ::memset(&addr, 0x00, sizeof(sockaddr_in)); - - addr.sin_family = AF_INET; - addr.sin_addr = address; - addr.sin_port = htons(port); - #if defined(_WIN32) || defined(_WIN64) - int ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&addr, sizeof(sockaddr_in)); + int ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&address, address_length); #else - ssize_t ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&addr, sizeof(sockaddr_in)); + ssize_t ret = ::sendto(m_fd, (char *)buffer, length, 0, (sockaddr *)&address, address_length); #endif if (ret < 0) { #if defined(_WIN32) || defined(_WIN64) diff --git a/UDPSocket.h b/UDPSocket.h index e0af272..ec5de9c 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -31,7 +31,8 @@ #include #include #else -#include +#include +#include #endif class CUDPSocket { @@ -42,12 +43,12 @@ public: bool open(); - int read(unsigned char* buffer, unsigned int length, in_addr& address, unsigned int& port); - bool write(const unsigned char* buffer, unsigned int length, const in_addr& address, unsigned int port); + int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length); + bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length); void close(); - static in_addr lookup(const std::string& hostName); + static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length); private: std::string m_address; From 5dccd5c5ce6ae5afd424327816366ae1e19cea87 Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Sat, 28 Mar 2020 04:37:51 +0900 Subject: [PATCH 02/10] add match(), isnone() utility function match() checks address family, IP address and port between two sockaddr_storages. isnone() checks sockaddr_storage has INADDR_NONE IPv4 address. (sockaddr_storage has this address when lookup() failed) --- UDPSocket.cpp | 31 +++++++++++++++++++++++++++++++ UDPSocket.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 7899601..9e5e2cf 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -86,6 +86,37 @@ int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_ return 0; } +bool CUDPSocket::match(const sockaddr_storage &addr1, const sockaddr_storage &addr2) +{ + if (addr1.ss_family != addr2.ss_family) + return false; + + switch (addr1.ss_family) { + case AF_INET: + struct sockaddr_in *in_1, *in_2; + in_1 = (struct sockaddr_in *)&addr1; + in_2 = (struct sockaddr_in *)&addr2; + return ( (in_1->sin_addr.s_addr == in_2->sin_addr.s_addr) && + (in_1->sin_port == in_2->sin_port) ); + case AF_INET6: + struct sockaddr_in6 *in6_1, *in6_2; + in6_1 = (struct sockaddr_in6 *)&addr1; + in6_2 = (struct sockaddr_in6 *)&addr2; + return ( IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr) && + (in6_1->sin6_port == in6_2->sin6_port) ); + default: + return false; + } +} + +bool CUDPSocket::isnone(const sockaddr_storage &addr) +{ + struct sockaddr_in *in = (struct sockaddr_in *)&addr; + + return ( (addr.ss_family == AF_INET) && + (in->sin_addr.s_addr == htonl(INADDR_NONE)) ); +} + bool CUDPSocket::open() { int err; diff --git a/UDPSocket.h b/UDPSocket.h index ec5de9c..288273f 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -49,6 +49,8 @@ public: void close(); static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length); + static bool match(const sockaddr_storage &addr1, const sockaddr_storage &addr2); + static bool isnone(const sockaddr_storage &addr); private: std::string m_address; From c92039d83bb9f193ff189f5634c365523c5e4b66 Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Sat, 28 Mar 2020 05:40:35 +0900 Subject: [PATCH 03/10] modified for IPv6 supported CUDPSocket --- DMRNetwork.cpp | 17 +++++++------- DMRNetwork.h | 3 ++- DStarNetwork.cpp | 26 ++++++++------------ DStarNetwork.h | 4 ++-- MMDVMHost.cpp | 15 ++++++------ MobileGPS.cpp | 12 +++++----- MobileGPS.h | 4 ++-- NXDNNetwork.cpp | 22 +++++++---------- NXDNNetwork.h | 4 ++-- P25Network.cpp | 60 +++++++++++++++++++++-------------------------- P25Network.h | 4 ++-- POCSAGNetwork.cpp | 22 +++++++---------- POCSAGNetwork.h | 4 ++-- RemoteCommand.cpp | 6 +++-- RemoteControl.cpp | 6 ++--- YSFNetwork.cpp | 24 +++++++------------ YSFNetwork.h | 4 ++-- 17 files changed, 105 insertions(+), 132 deletions(-) diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index b2aedb5..ea52096 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -36,6 +36,7 @@ const unsigned int HOMEBREW_DATA_PACKET_LENGTH = 55U; CDMRNetwork::CDMRNetwork(const std::string& address, unsigned int port, unsigned int local, unsigned int id, const std::string& password, bool duplex, const char* version, bool debug, bool slot1, bool slot2, HW_TYPE hwType) : m_addressStr(address), m_address(), +m_addrlen(), m_port(port), m_id(NULL), m_password(password), @@ -73,7 +74,7 @@ m_beacon(false) assert(id > 1000U); assert(!password.empty()); - m_address = CUDPSocket::lookup(address); + CUDPSocket::lookup(m_addressStr, m_port, m_address, m_addrlen); m_buffer = new unsigned char[BUFFER_LENGTH]; m_salt = new unsigned char[sizeof(uint32_t)]; @@ -124,8 +125,8 @@ bool CDMRNetwork::open() { LogMessage("DMR, Opening DMR Network"); - if (m_address.s_addr == INADDR_NONE) - m_address = CUDPSocket::lookup(m_addressStr); + if (CUDPSocket::isnone(m_address)) + CUDPSocket::lookup(m_addressStr, m_port, m_address, m_addrlen); m_status = WAITING_CONNECT; m_timeoutTimer.stop(); @@ -377,9 +378,9 @@ void CDMRNetwork::clock(unsigned int ms) return; } - in_addr address; - unsigned int port; - int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, port); + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, addrlen); if (length < 0) { LogError("DMR, Socket has failed, retrying connection to the master"); close(); @@ -390,7 +391,7 @@ void CDMRNetwork::clock(unsigned int ms) // if (m_debug && length > 0) // CUtils::dump(1U, "Network Received", m_buffer, length); - if (length > 0 && m_address.s_addr == address.s_addr && m_port == port) { + if (length > 0 && CUDPSocket::match(m_address, address)) { if (::memcmp(m_buffer, "DMRD", 4U) == 0) { if (m_enabled) { if (m_debug) @@ -663,7 +664,7 @@ bool CDMRNetwork::write(const unsigned char* data, unsigned int length) // if (m_debug) // CUtils::dump(1U, "Network Transmitted", data, length); - bool ret = m_socket.write(data, length, m_address, m_port); + bool ret = m_socket.write(data, length, m_address, m_addrlen); if (!ret) { LogError("DMR, Socket has failed when writing data to the master, retrying connection"); m_socket.close(); diff --git a/DMRNetwork.h b/DMRNetwork.h index 9d1c52e..96f1074 100644 --- a/DMRNetwork.h +++ b/DMRNetwork.h @@ -60,7 +60,8 @@ public: private: std::string m_addressStr; - in_addr m_address; + sockaddr_storage m_address; + unsigned int m_addrlen; unsigned int m_port; uint8_t* m_id; std::string m_password; diff --git a/DStarNetwork.cpp b/DStarNetwork.cpp index de0af69..295c289 100644 --- a/DStarNetwork.cpp +++ b/DStarNetwork.cpp @@ -33,7 +33,7 @@ const unsigned int BUFFER_LENGTH = 100U; CDStarNetwork::CDStarNetwork(const std::string& gatewayAddress, unsigned int gatewayPort, unsigned int localPort, bool duplex, const char* version, bool debug) : m_socket(localPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_duplex(duplex), m_version(version), m_debug(debug), @@ -46,7 +46,7 @@ m_pollTimer(1000U, 60U), m_linkStatus(LS_NONE), m_linkReflector(NULL) { - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); m_linkReflector = new unsigned char[DSTAR_LONG_CALLSIGN_LENGTH]; @@ -63,7 +63,7 @@ bool CDStarNetwork::open() { LogMessage("Opening D-Star network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; m_pollTimer.start(); @@ -100,7 +100,7 @@ bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length CUtils::dump(1U, "D-Star Network Header Sent", buffer, 49U); for (unsigned int i = 0U; i < 2U; i++) { - bool ret = m_socket.write(buffer, 49U, m_address, m_port); + bool ret = m_socket.write(buffer, 49U, m_address, m_addrlen); if (!ret) return false; } @@ -143,7 +143,7 @@ bool CDStarNetwork::writeData(const unsigned char* data, unsigned int length, un if (m_debug) CUtils::dump(1U, "D-Star Network Data Sent", buffer, length + 9U); - return m_socket.write(buffer, length + 9U, m_address, m_port); + return m_socket.write(buffer, length + 9U, m_address, m_addrlen); } bool CDStarNetwork::writePoll(const char* text) @@ -167,7 +167,7 @@ bool CDStarNetwork::writePoll(const char* text) // if (m_debug) // CUtils::dump(1U, "D-Star Network Poll Sent", buffer, 6U + length); - return m_socket.write(buffer, 6U + length, m_address, m_port); + return m_socket.write(buffer, 6U + length, m_address, m_addrlen); } void CDStarNetwork::clock(unsigned int ms) @@ -192,18 +192,12 @@ void CDStarNetwork::clock(unsigned int ms) unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || m_port != port) { - LogMessage("D-Star packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Invalid packet type? if (::memcmp(buffer, "DSRP", 4U) != 0) return; diff --git a/DStarNetwork.h b/DStarNetwork.h index aeebbbf..6f96880 100644 --- a/DStarNetwork.h +++ b/DStarNetwork.h @@ -51,8 +51,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_duplex; const char* m_version; bool m_debug; diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 53f6d1f..4769895 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -316,8 +316,8 @@ int CMMDVMHost::run() return 1; } - in_addr transparentAddress; - unsigned int transparentPort = 0U; + sockaddr_storage transparentAddress; + unsigned int transparentAddrLen; CUDPSocket* transparentSocket = NULL; unsigned int sendFrameType = 0U; @@ -333,8 +333,7 @@ int CMMDVMHost::run() LogInfo(" Local Port: %u", localPort); LogInfo(" Send Frame Type: %u", sendFrameType); - transparentAddress = CUDPSocket::lookup(remoteAddress); - transparentPort = remotePort; + CUDPSocket::lookup(remoteAddress, remotePort, transparentAddress, transparentAddrLen); transparentSocket = new CUDPSocket(localPort); ret = transparentSocket->open(); @@ -793,7 +792,7 @@ int CMMDVMHost::run() len = m_modem->readTransparentData(data); if (transparentSocket != NULL && len > 0U) - transparentSocket->write(data, len, transparentAddress, transparentPort); + transparentSocket->write(data, len, transparentAddress, transparentAddrLen); if (!m_fixedMode) { if (m_modeTimer.isRunning() && m_modeTimer.hasExpired()) @@ -942,9 +941,9 @@ int CMMDVMHost::run() } if (transparentSocket != NULL) { - in_addr address; - unsigned int port = 0U; - len = transparentSocket->read(data, 200U, address, port); + sockaddr_storage address; + unsigned int addrlen; + len = transparentSocket->read(data, 200U, address, addrlen); if (len > 0U) m_modem->writeTransparentData(data, len); } diff --git a/MobileGPS.cpp b/MobileGPS.cpp index 27721bd..7cd782e 100644 --- a/MobileGPS.cpp +++ b/MobileGPS.cpp @@ -26,7 +26,7 @@ CMobileGPS::CMobileGPS(const std::string& address, unsigned int port, CDMRNetwork* network) : m_idTimer(1000U, 60U), m_address(), -m_port(port), +m_addrlen(), m_socket(), m_network(network) { @@ -34,7 +34,7 @@ m_network(network) assert(port > 0U); assert(network != NULL); - m_address = CUDPSocket::lookup(address); + CUDPSocket::lookup(address, port, m_address, m_addrlen); } CMobileGPS::~CMobileGPS() @@ -71,16 +71,16 @@ void CMobileGPS::close() bool CMobileGPS::pollGPS() { - return m_socket.write((unsigned char*)"MMDVMHost", 9U, m_address, m_port); + return m_socket.write((unsigned char*)"MMDVMHost", 9U, m_address, m_addrlen); } void CMobileGPS::sendReport() { // Grab GPS data if it's available unsigned char buffer[200U]; - in_addr address; - unsigned int port; - int ret = m_socket.read(buffer, 200U, address, port); + sockaddr_storage address; + unsigned int addrlen; + int ret = m_socket.read(buffer, 200U, address, addrlen); if (ret <= 0) return; diff --git a/MobileGPS.h b/MobileGPS.h index 8d69572..8384c65 100644 --- a/MobileGPS.h +++ b/MobileGPS.h @@ -51,8 +51,8 @@ public: private: CTimer m_idTimer; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; CUDPSocket m_socket; CDMRNetwork* m_network; diff --git a/NXDNNetwork.cpp b/NXDNNetwork.cpp index 9e26900..dcf215e 100644 --- a/NXDNNetwork.cpp +++ b/NXDNNetwork.cpp @@ -31,7 +31,7 @@ const unsigned int BUFFER_LENGTH = 200U; CNXDNNetwork::CNXDNNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) : m_socket(localAddress, localPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_debug(debug), m_enabled(false), m_buffer(1000U, "NXDN Network") @@ -39,7 +39,7 @@ m_buffer(1000U, "NXDN Network") assert(gatewayPort > 0U); assert(!gatewayAddress.empty()); - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); } CNXDNNetwork::~CNXDNNetwork() @@ -50,7 +50,7 @@ bool CNXDNNetwork::open() { LogMessage("Opening NXDN network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; return m_socket.open(); @@ -100,25 +100,19 @@ bool CNXDNNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_TYPE ty if (m_debug) CUtils::dump(1U, "NXDN Network Data Sent", buffer, 102U); - return m_socket.write(buffer, 102U, m_address, m_port); + return m_socket.write(buffer, 102U, m_address, m_addrlen); } void CNXDNNetwork::clock(unsigned int ms) { unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || port != m_port) { - LogMessage("NXDN packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Invalid packet type? if (::memcmp(buffer, "ICOM", 4U) != 0) return; diff --git a/NXDNNetwork.h b/NXDNNetwork.h index 3a5b784..ec428d9 100644 --- a/NXDNNetwork.h +++ b/NXDNNetwork.h @@ -57,8 +57,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_debug; bool m_enabled; CRingBuffer m_buffer; diff --git a/P25Network.cpp b/P25Network.cpp index 14a0fd5..a326966 100644 --- a/P25Network.cpp +++ b/P25Network.cpp @@ -90,13 +90,13 @@ const unsigned int BUFFER_LENGTH = 100U; CP25Network::CP25Network(const std::string& gatewayAddress, unsigned int gatewayPort, unsigned int localPort, bool debug) : m_socket(localPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_debug(debug), m_enabled(false), m_buffer(1000U, "P25 Network"), m_audio() { - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); } CP25Network::~CP25Network() @@ -107,7 +107,7 @@ bool CP25Network::open() { LogMessage("Opening P25 network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; return m_socket.open(); @@ -126,7 +126,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 22U); - bool ret = m_socket.write(buffer, 22U, m_address, m_port); + bool ret = m_socket.write(buffer, 22U, m_address, m_addrlen); if (!ret) return false; @@ -137,7 +137,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 14U); - ret = m_socket.write(buffer, 14U, m_address, m_port); + ret = m_socket.write(buffer, 14U, m_address, m_addrlen); if (!ret) return false; @@ -150,7 +150,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -165,7 +165,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -180,7 +180,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -191,7 +191,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -202,7 +202,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -213,7 +213,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -226,7 +226,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU1 Sent", buffer, 16U); - ret = m_socket.write(buffer, 16U, m_address, m_port); + ret = m_socket.write(buffer, 16U, m_address, m_addrlen); if (!ret) return false; @@ -234,7 +234,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network END Sent", REC80, 17U); - ret = m_socket.write(REC80, 17U, m_address, m_port); + ret = m_socket.write(REC80, 17U, m_address, m_addrlen); if (!ret) return false; } @@ -255,7 +255,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 22U); - bool ret = m_socket.write(buffer, 22U, m_address, m_port); + bool ret = m_socket.write(buffer, 22U, m_address, m_addrlen); if (!ret) return false; @@ -266,7 +266,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 14U); - ret = m_socket.write(buffer, 14U, m_address, m_port); + ret = m_socket.write(buffer, 14U, m_address, m_addrlen); if (!ret) return false; @@ -283,7 +283,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -297,7 +297,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -311,7 +311,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -326,7 +326,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -337,7 +337,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -348,7 +348,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 17U); - ret = m_socket.write(buffer, 17U, m_address, m_port); + ret = m_socket.write(buffer, 17U, m_address, m_addrlen); if (!ret) return false; @@ -361,7 +361,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network LDU2 Sent", buffer, 16U); - ret = m_socket.write(buffer, 16U, m_address, m_port); + ret = m_socket.write(buffer, 16U, m_address, m_addrlen); if (!ret) return false; @@ -369,7 +369,7 @@ bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, if (m_debug) CUtils::dump(1U, "P25 Network END Sent", REC80, 17U); - ret = m_socket.write(REC80, 17U, m_address, m_port); + ret = m_socket.write(REC80, 17U, m_address, m_addrlen); if (!ret) return false; } @@ -381,18 +381,12 @@ void CP25Network::clock(unsigned int ms) { unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || m_port != port) { - LogMessage("P25 packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - if (!m_enabled) return; diff --git a/P25Network.h b/P25Network.h index 054c772..009c994 100644 --- a/P25Network.h +++ b/P25Network.h @@ -49,8 +49,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_debug; bool m_enabled; CRingBuffer m_buffer; diff --git a/POCSAGNetwork.cpp b/POCSAGNetwork.cpp index 682fdd1..e6b755a 100644 --- a/POCSAGNetwork.cpp +++ b/POCSAGNetwork.cpp @@ -31,12 +31,12 @@ const unsigned int BUFFER_LENGTH = 200U; CPOCSAGNetwork::CPOCSAGNetwork(const std::string& myAddress, unsigned int myPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) : m_socket(myAddress, myPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_debug(debug), m_enabled(false), m_buffer(1000U, "POCSAG Network") { - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); } CPOCSAGNetwork::~CPOCSAGNetwork() @@ -47,7 +47,7 @@ bool CPOCSAGNetwork::open() { LogMessage("Opening POCSAG network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; return m_socket.open(); @@ -57,18 +57,12 @@ void CPOCSAGNetwork::clock(unsigned int ms) { unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || m_port != port) { - LogMessage("POCSAG packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Invalid packet type? if (::memcmp(buffer, "POCSAG", 6U) != 0) return; @@ -118,7 +112,7 @@ void CPOCSAGNetwork::enable(bool enabled) unsigned char c = enabled ? 0x00U : 0xFFU; - m_socket.write(&c, 1U, m_address, m_port); + m_socket.write(&c, 1U, m_address, m_addrlen); m_enabled = enabled; } diff --git a/POCSAGNetwork.h b/POCSAGNetwork.h index fe95203..dd3945b 100644 --- a/POCSAGNetwork.h +++ b/POCSAGNetwork.h @@ -46,8 +46,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_debug; bool m_enabled; CRingBuffer m_buffer; diff --git a/RemoteCommand.cpp b/RemoteCommand.cpp index bf3fb1e..42a09be 100644 --- a/RemoteCommand.cpp +++ b/RemoteCommand.cpp @@ -67,9 +67,11 @@ int CRemoteCommand::send(const std::string& command) if (!ret) return 1; - in_addr address = CUDPSocket::lookup("localhost"); + sockaddr_storage address; + unsigned int addrlen; + CUDPSocket::lookup("localhost", m_port, address, addrlen); - ret = socket.write((unsigned char*)command.c_str(), command.length(), address, m_port); + ret = socket.write((unsigned char*)command.c_str(), command.length(), address, addrlen); if (!ret) { socket.close(); return 1; diff --git a/RemoteControl.cpp b/RemoteControl.cpp index afa1473..0c72f6b 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -53,9 +53,9 @@ REMOTE_COMMAND CRemoteControl::getCommand() char command[BUFFER_LENGTH]; char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int ret = m_socket.read((unsigned char*)buffer, BUFFER_LENGTH, address, port); + sockaddr_storage address; + unsigned int addrlen; + int ret = m_socket.read((unsigned char*)buffer, BUFFER_LENGTH, address, addrlen); if (ret > 0) { buffer[ret] = '\0'; diff --git a/YSFNetwork.cpp b/YSFNetwork.cpp index a8effba..ff5cab8 100644 --- a/YSFNetwork.cpp +++ b/YSFNetwork.cpp @@ -31,7 +31,7 @@ const unsigned int BUFFER_LENGTH = 200U; CYSFNetwork::CYSFNetwork(const std::string& myAddress, unsigned int myPort, const std::string& gatewayAddress, unsigned int gatewayPort, const std::string& callsign, bool debug) : m_socket(myAddress, myPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_callsign(), m_debug(debug), m_enabled(false), @@ -42,7 +42,7 @@ m_tag(NULL) m_callsign = callsign; m_callsign.resize(YSF_CALLSIGN_LENGTH, ' '); - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); m_tag = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memset(m_tag, ' ', YSF_CALLSIGN_LENGTH); @@ -57,7 +57,7 @@ bool CYSFNetwork::open() { LogMessage("Opening YSF network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; m_pollTimer.start(); @@ -97,7 +97,7 @@ bool CYSFNetwork::write(const unsigned char* src, const unsigned char* dest, con if (m_debug) CUtils::dump(1U, "YSF Network Data Sent", buffer, 155U); - return m_socket.write(buffer, 155U, m_address, m_port); + return m_socket.write(buffer, 155U, m_address, m_addrlen); } bool CYSFNetwork::writePoll() @@ -115,7 +115,7 @@ bool CYSFNetwork::writePoll() if (m_debug) CUtils::dump(1U, "YSF Network Poll Sent", buffer, 14U); - return m_socket.write(buffer, 14U, m_address, m_port); + return m_socket.write(buffer, 14U, m_address, m_addrlen); } void CYSFNetwork::clock(unsigned int ms) @@ -128,18 +128,12 @@ void CYSFNetwork::clock(unsigned int ms) unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || m_port != port) { - LogMessage("YSF packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Ignore incoming polls if (::memcmp(buffer, "YSFP", 4U) == 0) return; diff --git a/YSFNetwork.h b/YSFNetwork.h index e9a430f..292364d 100644 --- a/YSFNetwork.h +++ b/YSFNetwork.h @@ -48,8 +48,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; std::string m_callsign; bool m_debug; bool m_enabled; From dad47317e638d22c8d4008eb63032895ba1739ca Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Sun, 29 Mar 2020 15:06:20 +0900 Subject: [PATCH 04/10] set INADDR_ANY/IN6ADDR_ANY_INIT address string to m_socket when CUDPSocket::open() is called with m_address (in CUDPSocket) is nothing, IPv4 socket is created by "0.0.0.0" (INADDR_ANY) address. This causes a problem that DMRGateway cannot connect to reflector on IPv6. To choose default INADDR_ANY/IN6ADDR_ANY_INIT address, added open(address_family) in UDPSocket.cpp. Following code sets address string at construction, not modified. NXDNNetwork.cpp POCSAGNetwork.cpp YSFNetwork.cpp Other codes does not set, modified open() -> open(address_family) DMRNetwork.cpp DStarNetwork.cpp MMDVMHost.cpp MobileGPS.cpp P25Network.cpp RemoteCommand.cpp RemoteControl.cpp I think there is more clever method, but I have no other idea. Maybe IPv6 support for digital radio works, but RemoteControl can work IPv4 only. --- DMRNetwork.cpp | 2 +- DStarNetwork.cpp | 2 +- MMDVMHost.cpp | 2 +- MobileGPS.cpp | 2 +- P25Network.cpp | 2 +- RemoteCommand.cpp | 14 +++++++------- RemoteControl.cpp | 2 +- UDPSocket.cpp | 25 ++++++++++++++++++++++++- UDPSocket.h | 1 + 9 files changed, 38 insertions(+), 14 deletions(-) diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index ea52096..91ae0a4 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -362,7 +362,7 @@ void CDMRNetwork::clock(unsigned int ms) if (m_status == WAITING_CONNECT) { m_retryTimer.clock(ms); if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) { - bool ret = m_socket.open(); + bool ret = m_socket.open(m_address.ss_family); if (ret) { ret = writeLogin(); if (!ret) diff --git a/DStarNetwork.cpp b/DStarNetwork.cpp index 295c289..072b7cf 100644 --- a/DStarNetwork.cpp +++ b/DStarNetwork.cpp @@ -68,7 +68,7 @@ bool CDStarNetwork::open() m_pollTimer.start(); - return m_socket.open(); + return m_socket.open(m_address.ss_family); } bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length, bool busy) diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 4769895..9f792e5 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -336,7 +336,7 @@ int CMMDVMHost::run() CUDPSocket::lookup(remoteAddress, remotePort, transparentAddress, transparentAddrLen); transparentSocket = new CUDPSocket(localPort); - ret = transparentSocket->open(); + ret = transparentSocket->open(transparentAddress.ss_family); if (!ret) { LogWarning("Could not open the Transparent data socket, disabling"); delete transparentSocket; diff --git a/MobileGPS.cpp b/MobileGPS.cpp index 7cd782e..0cb2c3b 100644 --- a/MobileGPS.cpp +++ b/MobileGPS.cpp @@ -43,7 +43,7 @@ CMobileGPS::~CMobileGPS() bool CMobileGPS::open() { - bool ret = m_socket.open(); + bool ret = m_socket.open(m_address.ss_family); if (!ret) return false; diff --git a/P25Network.cpp b/P25Network.cpp index a326966..ed28fa6 100644 --- a/P25Network.cpp +++ b/P25Network.cpp @@ -110,7 +110,7 @@ bool CP25Network::open() if (CUDPSocket::isnone(m_address)) return false; - return m_socket.open(); + return m_socket.open(m_address.ss_family); } bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, const CP25LowSpeedData& lsd, bool end) diff --git a/RemoteCommand.cpp b/RemoteCommand.cpp index 42a09be..9d7b038 100644 --- a/RemoteCommand.cpp +++ b/RemoteCommand.cpp @@ -61,15 +61,15 @@ CRemoteCommand::~CRemoteCommand() int CRemoteCommand::send(const std::string& command) { - CUDPSocket socket(0U); - - bool ret = socket.open(); - if (!ret) - return 1; - sockaddr_storage address; unsigned int addrlen; - CUDPSocket::lookup("localhost", m_port, address, addrlen); + CUDPSocket::lookup("127.0.0.1", m_port, address, addrlen); + + CUDPSocket socket(0U); + + bool ret = socket.open(address.ss_family); + if (!ret) + return 1; ret = socket.write((unsigned char*)command.c_str(), command.length(), address, addrlen); if (!ret) { diff --git a/RemoteControl.cpp b/RemoteControl.cpp index 0c72f6b..0c29791 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -43,7 +43,7 @@ CRemoteControl::~CRemoteControl() bool CRemoteControl::open() { - return m_socket.open(); + return m_socket.open(AF_INET); /* XXX IPv4 only */ } REMOTE_COMMAND CRemoteControl::getCommand() diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 9e5e2cf..a2b5991 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -117,14 +117,37 @@ bool CUDPSocket::isnone(const sockaddr_storage &addr) (in->sin_addr.s_addr == htonl(INADDR_NONE)) ); } +bool CUDPSocket::open(const unsigned int af) +{ + switch (af) { + case AF_INET6: + m_address = "::"; + break; + case AF_INET: + m_address = "0.0.0.0"; + break; + default: + LogWarning("unknown address family - %d", af); + break; + } + + return open(); +} + bool CUDPSocket::open() { int err; sockaddr_storage addr; unsigned int addrlen; + /* m_address should be defined */ + if (m_address.empty()) { + LogError("The local address is undefined"); + return false; + } + /* to determine protocol family, call lookup() first. */ - err = lookup(m_address.empty() ? "0.0.0.0" : m_address.c_str(), m_port, addr, addrlen); + err = lookup(m_address.c_str(), m_port, addr, addrlen); if (err) { LogError("The local address is invalid - %s", m_address.c_str()); return false; diff --git a/UDPSocket.h b/UDPSocket.h index 288273f..b5add46 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -42,6 +42,7 @@ public: ~CUDPSocket(); bool open(); + bool open(const unsigned int af); int read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &address_length); bool write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int address_length); From 15b5011ebf0212894ca5bf574c1fc1efddf81c72 Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Sat, 4 Apr 2020 15:18:55 +0900 Subject: [PATCH 05/10] rewrite with getaddrinfo() API to support IPv6 Currently LCDproc seems to be IPv6 unsupported, but this code is modified for the future IPv6-supported LCDproc. --- LCDproc.cpp | 57 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 24 deletions(-) diff --git a/LCDproc.cpp b/LCDproc.cpp index 8ef2721..eddba78 100644 --- a/LCDproc.cpp +++ b/LCDproc.cpp @@ -121,44 +121,53 @@ CLCDproc::~CLCDproc() bool CLCDproc::open() { - const char *server; - unsigned int port, localPort; - struct sockaddr_in serverAddress, clientAddress; - struct hostent *h; + int err; + unsigned int addrlen; + std::string port, localPort; + struct sockaddr_storage serverAddress, clientAddress; + struct addrinfo hints, *res; - server = m_address.c_str(); - port = m_port; - localPort = m_localPort; + port = std::to_string(m_port); + localPort = std::to_string(m_localPort); + memset(&hints, 0, sizeof(hints)); + /* Lookup the hostname address */ + hints.ai_flags = AI_NUMERICSERV; + hints.ai_socktype = SOCK_STREAM; + err = getaddrinfo(m_address.c_str(), port.c_str(), &hints, &res); + if (err) { + LogError("LCDproc, cannot lookup server"); + return false; + } + memcpy(&serverAddress, res->ai_addr, addrlen = res->ai_addrlen); + freeaddrinfo(res); + + /* Lookup the client address (random port - need to specify manual port from ini file) */ + hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE; + hints.ai_family = serverAddress.ss_family; + err = getaddrinfo(NULL, localPort.c_str(), &hints, &res); + if (err) { + LogError("LCDproc, cannot lookup client"); + return false; + } + memcpy(&clientAddress, res->ai_addr, res->ai_addrlen); + freeaddrinfo(res); /* Create TCP socket */ - m_socketfd = socket(AF_INET, SOCK_STREAM, 0); + m_socketfd = socket(clientAddress.ss_family, SOCK_STREAM, 0); if (m_socketfd == -1) { LogError("LCDproc, failed to create socket"); return false; } - /* Sets client address (random port - need to specify manual port from ini file?) */ - clientAddress.sin_family = AF_INET; - clientAddress.sin_addr.s_addr = htonl(INADDR_ANY); - //clientAddress.sin_port = htons(0); - clientAddress.sin_port = htons(localPort); - /* Bind the address to the socket */ - if (bind(m_socketfd, (struct sockaddr *)&clientAddress, sizeof(clientAddress)) == -1) { + if (bind(m_socketfd, (struct sockaddr *)&clientAddress, addrlen) == -1) { LogError("LCDproc, error whilst binding address"); return false; } - /* Lookup the hostname address */ - h = gethostbyname(server); - - /* Sets server address */ - serverAddress.sin_family = h->h_addrtype; - memcpy((char*)&serverAddress.sin_addr.s_addr, h->h_addr_list[0], h->h_length); - serverAddress.sin_port = htons(port); - - if (connect(m_socketfd, (struct sockaddr * )&serverAddress, sizeof(serverAddress))==-1) { + /* Connect to server */ + if (connect(m_socketfd, (struct sockaddr *)&serverAddress, addrlen) == -1) { LogError("LCDproc, cannot connect to server"); return false; } From 88bbb0cd0f5a76269985e3504a550baadaf7512b Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Sun, 5 Apr 2020 07:05:33 +0900 Subject: [PATCH 06/10] use getaddrinfo() AI_PASSIVE flag, to remove "::" and "0.0.0.0" --- UDPSocket.cpp | 46 +++++++++++++++++++++------------------------- UDPSocket.h | 1 + 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index a2b5991..beec3ce 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -61,15 +61,24 @@ CUDPSocket::~CUDPSocket() } int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_storage &addr, unsigned int &address_length) +{ + struct addrinfo hints; + + ::memset(&hints, 0, sizeof(hints)); + + return lookup(hostname, port, addr, address_length, hints); +} + +int CUDPSocket::lookup(const std::string& hostname, unsigned int port, sockaddr_storage &addr, unsigned int &address_length, struct addrinfo &hints) { int err; std::string portstr = std::to_string(port); - struct addrinfo hints, *res; + struct addrinfo *res; - ::memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_flags = AI_NUMERICSERV; + /* port is always digits, no needs to lookup service */ + hints.ai_flags |= AI_NUMERICSERV; - err = getaddrinfo(hostname.c_str(), portstr.c_str(), &hints, &res); + err = getaddrinfo(hostname.empty() ? NULL : hostname.c_str(), portstr.c_str(), &hints, &res); if (err) { sockaddr_in *paddr = (sockaddr_in *)&addr; ::memset(paddr, 0, address_length = sizeof(sockaddr_in)); @@ -117,37 +126,24 @@ bool CUDPSocket::isnone(const sockaddr_storage &addr) (in->sin_addr.s_addr == htonl(INADDR_NONE)) ); } -bool CUDPSocket::open(const unsigned int af) +bool CUDPSocket::open() { - switch (af) { - case AF_INET6: - m_address = "::"; - break; - case AF_INET: - m_address = "0.0.0.0"; - break; - default: - LogWarning("unknown address family - %d", af); - break; - } - - return open(); + return open(AF_UNSPEC); } -bool CUDPSocket::open() +bool CUDPSocket::open(const unsigned int af) { int err; sockaddr_storage addr; unsigned int addrlen; + struct addrinfo hints; - /* m_address should be defined */ - if (m_address.empty()) { - LogError("The local address is undefined"); - return false; - } + ::memset(&hints, 0, sizeof(hints)); + hints.ai_flags = AI_PASSIVE; + hints.ai_family = af; /* to determine protocol family, call lookup() first. */ - err = lookup(m_address.c_str(), m_port, addr, addrlen); + err = lookup(m_address, m_port, addr, addrlen, hints); if (err) { LogError("The local address is invalid - %s", m_address.c_str()); return false; diff --git a/UDPSocket.h b/UDPSocket.h index b5add46..46b2370 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -50,6 +50,7 @@ public: void close(); static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length); + static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length, struct addrinfo &hints); static bool match(const sockaddr_storage &addr1, const sockaddr_storage &addr2); static bool isnone(const sockaddr_storage &addr); From 5df1fe551f232c25dff1302ff1f9350062b93995 Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Sat, 11 Apr 2020 13:12:19 +0900 Subject: [PATCH 07/10] add IPv6 support for RemoteControl To specify IP(v4/v6) address for RemoteControl port, add Address parameter in [RemoteControl] section to MMDVM.ini. Different from other Address(es), the default IP address of RemoteControl is 127.0.0.1 for security. --- Conf.cpp | 8 ++++++++ Conf.h | 2 ++ MMDVM.ini | 1 + MMDVMHost.cpp | 4 +++- RemoteControl.cpp | 6 +++--- RemoteControl.h | 2 +- 6 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 9325a1b..e365827 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -250,6 +250,7 @@ m_mobileGPSEnabled(false), m_mobileGPSAddress(), m_mobileGPSPort(0U), m_remoteControlEnabled(false), +m_remoteControlAddress("127.0.0.1"), m_remoteControlPort(0U) { } @@ -838,6 +839,8 @@ bool CConf::read() } else if (section == SECTION_REMOTE_CONTROL) { if (::strcmp(key, "Enable") == 0) m_remoteControlEnabled = ::atoi(value) == 1; + else if (::strcmp(key, "Address") == 0) + m_remoteControlAddress = value; else if (::strcmp(key, "Port") == 0) m_remoteControlPort = (unsigned int)::atoi(value); } @@ -1794,6 +1797,11 @@ bool CConf::getRemoteControlEnabled() const return m_remoteControlEnabled; } +std::string CConf::getRemoteControlAddress() const +{ + return m_remoteControlAddress; +} + unsigned int CConf::getRemoteControlPort() const { return m_remoteControlPort; diff --git a/Conf.h b/Conf.h index c76b202..42fa261 100644 --- a/Conf.h +++ b/Conf.h @@ -276,6 +276,7 @@ public: // The Remote Control section bool getRemoteControlEnabled() const; + std::string getRemoteControlAddress() const; unsigned int getRemoteControlPort() const; private: @@ -497,6 +498,7 @@ private: unsigned int m_mobileGPSPort; bool m_remoteControlEnabled; + std::string m_remoteControlAddress; unsigned int m_remoteControlPort; }; diff --git a/MMDVM.ini b/MMDVM.ini index d6a8d84..bf07c6a 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -257,4 +257,5 @@ Port=7834 [Remote Control] Enable=0 +Address=127.0.0.1 Port=7642 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 9f792e5..5ee837a 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -606,12 +606,14 @@ int CMMDVMHost::run() bool remoteControlEnabled = m_conf.getRemoteControlEnabled(); if (remoteControlEnabled) { + std::string address = m_conf.getRemoteControlAddress(); unsigned int port = m_conf.getRemoteControlPort(); LogInfo("Remote Control Parameters"); + LogInfo(" Address: %s", address.c_str()); LogInfo(" Port: %u", port); - m_remoteControl = new CRemoteControl(port); + m_remoteControl = new CRemoteControl(address, port); ret = m_remoteControl->open(); if (!ret) { diff --git a/RemoteControl.cpp b/RemoteControl.cpp index 0c29791..e982894 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -29,8 +29,8 @@ const unsigned int PAGE_ARGS = 3U; const unsigned int BUFFER_LENGTH = 100U; -CRemoteControl::CRemoteControl(unsigned int port) : -m_socket(port), +CRemoteControl::CRemoteControl(const std::string address, unsigned int port) : +m_socket(address, port), m_command(RCD_NONE), m_args() { @@ -43,7 +43,7 @@ CRemoteControl::~CRemoteControl() bool CRemoteControl::open() { - return m_socket.open(AF_INET); /* XXX IPv4 only */ + return m_socket.open(); } REMOTE_COMMAND CRemoteControl::getCommand() diff --git a/RemoteControl.h b/RemoteControl.h index 479987a..079d983 100644 --- a/RemoteControl.h +++ b/RemoteControl.h @@ -38,7 +38,7 @@ enum REMOTE_COMMAND { class CRemoteControl { public: - CRemoteControl(unsigned int port); + CRemoteControl(const std::string address, unsigned int port); ~CRemoteControl(); bool open(); From 6de0bdb5360b76d75bec692f7786357bd712c8ca Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Fri, 3 Jul 2020 04:35:22 +0900 Subject: [PATCH 08/10] add match_addr() match() compares IP address and port match_addr() compares IP address only --- UDPSocket.cpp | 21 +++++++++++++++++++++ UDPSocket.h | 1 + 2 files changed, 22 insertions(+) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index beec3ce..0bbe27b 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -118,6 +118,27 @@ bool CUDPSocket::match(const sockaddr_storage &addr1, const sockaddr_storage &ad } } +bool CUDPSocket::match_addr(const sockaddr_storage &addr1, const sockaddr_storage &addr2) +{ + if (addr1.ss_family != addr2.ss_family) + return false; + + switch (addr1.ss_family) { + case AF_INET: + struct sockaddr_in *in_1, *in_2; + in_1 = (struct sockaddr_in *)&addr1; + in_2 = (struct sockaddr_in *)&addr2; + return (in_1->sin_addr.s_addr == in_2->sin_addr.s_addr); + case AF_INET6: + struct sockaddr_in6 *in6_1, *in6_2; + in6_1 = (struct sockaddr_in6 *)&addr1; + in6_2 = (struct sockaddr_in6 *)&addr2; + return IN6_ARE_ADDR_EQUAL(&in6_1->sin6_addr, &in6_2->sin6_addr); + default: + return false; + } +} + bool CUDPSocket::isnone(const sockaddr_storage &addr) { struct sockaddr_in *in = (struct sockaddr_in *)&addr; diff --git a/UDPSocket.h b/UDPSocket.h index 46b2370..ad5b2a1 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -52,6 +52,7 @@ public: static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length); static int lookup(const std::string& hostName, unsigned int port, sockaddr_storage &address, unsigned int &address_length, struct addrinfo &hints); static bool match(const sockaddr_storage &addr1, const sockaddr_storage &addr2); + static bool match_addr(const sockaddr_storage &addr1, const sockaddr_storage &addr2); static bool isnone(const sockaddr_storage &addr); private: From 8a0db8cb8b685c5af1cfaa9d537578d753370e7f Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Fri, 3 Jul 2020 04:40:41 +0900 Subject: [PATCH 09/10] NXDNIcomNetwork: IPv6 support --- NXDNIcomNetwork.cpp | 22 ++++++++-------------- NXDNIcomNetwork.h | 4 ++-- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/NXDNIcomNetwork.cpp b/NXDNIcomNetwork.cpp index 2f3767b..3b340cc 100644 --- a/NXDNIcomNetwork.cpp +++ b/NXDNIcomNetwork.cpp @@ -31,7 +31,7 @@ const unsigned int BUFFER_LENGTH = 200U; CNXDNIcomNetwork::CNXDNIcomNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gatewayAddress, unsigned int gatewayPort, bool debug) : m_socket(localAddress, localPort), m_address(), -m_port(gatewayPort), +m_addrlen(), m_debug(debug), m_enabled(false), m_buffer(1000U, "NXDN Network") @@ -39,7 +39,7 @@ m_buffer(1000U, "NXDN Network") assert(gatewayPort > 0U); assert(!gatewayAddress.empty()); - m_address = CUDPSocket::lookup(gatewayAddress); + CUDPSocket::lookup(gatewayAddress, gatewayPort, m_address, m_addrlen); } CNXDNIcomNetwork::~CNXDNIcomNetwork() @@ -50,7 +50,7 @@ bool CNXDNIcomNetwork::open() { LogMessage("Opening NXDN network connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_address)) return false; return m_socket.open(); @@ -100,25 +100,19 @@ bool CNXDNIcomNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_TYP if (m_debug) CUtils::dump(1U, "NXDN Network Data Sent", buffer, 102U); - return m_socket.write(buffer, 102U, m_address, m_port); + return m_socket.write(buffer, 102U, m_address, m_addrlen); } void CNXDNIcomNetwork::clock(unsigned int ms) { unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match(m_address, address)) return; - // Check if the data is for us - if (m_address.s_addr != address.s_addr || port != m_port) { - LogMessage("NXDN packet received from an invalid source, %08X != %08X and/or %u != %u", m_address.s_addr, address.s_addr, m_port, port); - return; - } - // Invalid packet type? if (::memcmp(buffer, "ICOM", 4U) != 0) return; diff --git a/NXDNIcomNetwork.h b/NXDNIcomNetwork.h index 05fb023..18bdd97 100644 --- a/NXDNIcomNetwork.h +++ b/NXDNIcomNetwork.h @@ -49,8 +49,8 @@ public: private: CUDPSocket m_socket; - in_addr m_address; - unsigned int m_port; + sockaddr_storage m_address; + unsigned int m_addrlen; bool m_debug; bool m_enabled; CRingBuffer m_buffer; From 9137399ea92a87c90e81985f2defebf52d71c55c Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Fri, 3 Jul 2020 06:56:36 +0900 Subject: [PATCH 10/10] NXDNKenwoodNetwork: IPv6 support --- NXDNKenwoodNetwork.cpp | 58 +++++++++++++++++------------------------- NXDNKenwoodNetwork.h | 6 ++--- 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/NXDNKenwoodNetwork.cpp b/NXDNKenwoodNetwork.cpp index e873bd3..f84af6e 100644 --- a/NXDNKenwoodNetwork.cpp +++ b/NXDNKenwoodNetwork.cpp @@ -36,9 +36,9 @@ const unsigned int BUFFER_LENGTH = 200U; CNXDNKenwoodNetwork::CNXDNKenwoodNetwork(const std::string& localAddress, unsigned int localPort, const std::string& gwyAddress, unsigned int gwyPort, bool debug) : m_rtpSocket(localAddress, localPort + 0U), m_rtcpSocket(localAddress, localPort + 1U), -m_address(), -m_rtcpPort(gwyPort + 1U), -m_rtpPort(gwyPort + 0U), +m_rtcpaddress(), +m_rtpaddress(), +m_addrlen(), m_enabled(false), m_headerSeen(false), m_seen1(false), @@ -65,7 +65,8 @@ m_random() m_sacch = new unsigned char[10U]; - m_address = CUDPSocket::lookup(gwyAddress); + CUDPSocket::lookup(gwyAddress, gwyPort + 1, m_rtcpaddress, m_addrlen); + CUDPSocket::lookup(gwyAddress, gwyPort, m_rtpaddress, m_addrlen); std::random_device rd; std::mt19937 mt(rd()); @@ -81,7 +82,8 @@ bool CNXDNKenwoodNetwork::open() { LogMessage("Opening Kenwood connection"); - if (m_address.s_addr == INADDR_NONE) + if (CUDPSocket::isnone(m_rtpaddress) || + CUDPSocket::isnone(m_rtcpaddress)) return false; if (!m_rtcpSocket.open()) @@ -363,7 +365,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceHeader(const unsigned char* data) if (m_debug) CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 47U); - return m_rtpSocket.write(buffer, 47U, m_address, m_rtpPort); + return m_rtpSocket.write(buffer, 47U, m_rtpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::writeRTPVoiceTrailer(const unsigned char* data) @@ -409,7 +411,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceTrailer(const unsigned char* data) if (m_debug) CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 47U); - return m_rtpSocket.write(buffer, 47U, m_address, m_rtpPort); + return m_rtpSocket.write(buffer, 47U, m_rtpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::writeRTPVoiceData(const unsigned char* data) @@ -455,7 +457,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceData(const unsigned char* data) if (m_debug) CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 59U); - return m_rtpSocket.write(buffer, 59U, m_address, m_rtpPort); + return m_rtpSocket.write(buffer, 59U, m_rtpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::writeRTPDataHeader(const unsigned char* data) @@ -497,7 +499,7 @@ bool CNXDNKenwoodNetwork::writeRTPDataHeader(const unsigned char* data) if (m_debug) CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U); - return m_rtpSocket.write(buffer, 42U, m_address, m_rtpPort); + return m_rtpSocket.write(buffer, 42U, m_rtpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::writeRTPDataTrailer(const unsigned char* data) @@ -539,7 +541,7 @@ bool CNXDNKenwoodNetwork::writeRTPDataTrailer(const unsigned char* data) if (m_debug) CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U); - return m_rtpSocket.write(buffer, 42U, m_address, m_rtpPort); + return m_rtpSocket.write(buffer, 42U, m_rtpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::writeRTPDataData(const unsigned char* data) @@ -581,7 +583,7 @@ bool CNXDNKenwoodNetwork::writeRTPDataData(const unsigned char* data) if (m_debug) CUtils::dump(1U, "Kenwood Network RTP Data Sent", buffer, 42U); - return m_rtpSocket.write(buffer, 42U, m_address, m_rtpPort); + return m_rtpSocket.write(buffer, 42U, m_rtpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::writeRTCPStart() @@ -641,7 +643,7 @@ bool CNXDNKenwoodNetwork::writeRTCPStart() if (m_debug) CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 28U); - return m_rtcpSocket.write(buffer, 28U, m_address, m_rtcpPort); + return m_rtcpSocket.write(buffer, 28U, m_rtcpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::writeRTCPPing() @@ -683,7 +685,7 @@ bool CNXDNKenwoodNetwork::writeRTCPPing() if (m_debug) CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 28U); - return m_rtcpSocket.write(buffer, 28U, m_address, m_rtcpPort); + return m_rtcpSocket.write(buffer, 28U, m_rtcpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::writeRTCPHang(unsigned char type, unsigned short src, unsigned short dst) @@ -726,7 +728,7 @@ bool CNXDNKenwoodNetwork::writeRTCPHang() if (m_debug) CUtils::dump(1U, "Kenwood Network RTCP Data Sent", buffer, 20U); - return m_rtcpSocket.write(buffer, 20U, m_address, m_rtcpPort); + return m_rtcpSocket.write(buffer, 20U, m_rtcpaddress, m_addrlen); } bool CNXDNKenwoodNetwork::read(unsigned char* data) @@ -761,18 +763,12 @@ unsigned int CNXDNKenwoodNetwork::readRTP(unsigned char* data) unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_rtpSocket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_rtpSocket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match_addr(m_rtpaddress, address)) return 0U; - // Check if the data is for us - if (m_address.s_addr != address.s_addr) { - LogMessage("Kenwood RTP packet received from an invalid source, %08X != %08X", m_address.s_addr, address.s_addr); - return 0U; - } - if (!m_enabled) return 0U; @@ -790,18 +786,12 @@ unsigned int CNXDNKenwoodNetwork::readRTCP(unsigned char* data) unsigned char buffer[BUFFER_LENGTH]; - in_addr address; - unsigned int port; - int length = m_rtcpSocket.read(buffer, BUFFER_LENGTH, address, port); - if (length <= 0) + sockaddr_storage address; + unsigned int addrlen; + int length = m_rtcpSocket.read(buffer, BUFFER_LENGTH, address, addrlen); + if (length <= 0 || !CUDPSocket::match_addr(m_rtcpaddress, address)) return 0U; - // Check if the data is for us - if (m_address.s_addr != address.s_addr) { - LogMessage("Kenwood RTCP packet received from an invalid source, %08X != %08X", m_address.s_addr, address.s_addr); - return 0U; - } - if (!m_enabled) return 0U; diff --git a/NXDNKenwoodNetwork.h b/NXDNKenwoodNetwork.h index 6645c23..3466569 100644 --- a/NXDNKenwoodNetwork.h +++ b/NXDNKenwoodNetwork.h @@ -49,9 +49,9 @@ public: private: CUDPSocket m_rtpSocket; CUDPSocket m_rtcpSocket; - in_addr m_address; - unsigned int m_rtcpPort; - unsigned int m_rtpPort; + sockaddr_storage m_rtcpaddress; + sockaddr_storage m_rtpaddress; + unsigned int m_addrlen; bool m_enabled; bool m_headerSeen; bool m_seen1;