From be9b402aa3c68eb5c86fe8954c4a4c6a251685f0 Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Wed, 31 Mar 2021 13:35:37 +0200 Subject: [PATCH 1/3] Fix nasty bug in UDPSocket::close(). --- UDPSocket.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 510c8a2..ab025ec 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -187,6 +187,8 @@ bool CUDPSocket::open(const unsigned int index, const unsigned int af, const std return false; } + close(index); + int fd = ::socket(addr.ss_family, SOCK_DGRAM, 0); if (fd < 0) { #if defined(_WIN32) || defined(_WIN64) @@ -343,13 +345,13 @@ bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const s void CUDPSocket::close() { - for (int i = 0; i < UDP_SOCKET_MAX; i++) - close(m_fd[i]); + for (unsigned int i = 0; i < UDP_SOCKET_MAX; i++) + close(i); } void CUDPSocket::close(const unsigned int index) { - if (m_fd[index] >= 0) { + if ((index < UDP_SOCKET_MAX) && (m_fd[index] >= 0)) { #if defined(_WIN32) || defined(_WIN64) ::closesocket(m_fd[index]); #else From 86f492745e48720dc131506451e35ef673565ea0 Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Fri, 2 Apr 2021 06:29:57 +0200 Subject: [PATCH 2/3] Do not try to send RPTCL if the connection is already broken. --- DMRNetwork.cpp | 12 ++++++------ DMRNetwork.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index 4411764..872c2fc 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -298,11 +298,11 @@ bool CDMRNetwork::isConnected() const return m_status == RUNNING; } -void CDMRNetwork::close() +void CDMRNetwork::close(bool sayGoodbye) { LogMessage("%s, Closing DMR Network", m_name.c_str()); - if (m_status == RUNNING) { + if (sayGoodbye && (m_status == RUNNING)) { unsigned char buffer[9U]; ::memcpy(buffer + 0U, "RPTCL", 5U); ::memcpy(buffer + 5U, m_id, 4U); @@ -341,7 +341,7 @@ void CDMRNetwork::clock(unsigned int ms) int length = m_socket.read(m_buffer, BUFFER_LENGTH, address, addrlen); if (length < 0) { LogError("%s, Socket has failed, retrying connection to the master", m_name.c_str()); - close(); + close(false); open(); return; } @@ -414,7 +414,7 @@ void CDMRNetwork::clock(unsigned int ms) } } else if (::memcmp(m_buffer, "MSTCL", 5U) == 0) { LogError("%s, Master is closing down", m_name.c_str()); - close(); + close(false); open(); } else if (::memcmp(m_buffer, "MSTPONG", 7U) == 0) { m_timeoutTimer.start(); @@ -455,7 +455,7 @@ void CDMRNetwork::clock(unsigned int ms) m_timeoutTimer.clock(ms); if (m_timeoutTimer.isRunning() && m_timeoutTimer.hasExpired()) { LogError("%s, Connection to the master has timed out, retrying connection", m_name.c_str()); - close(); + close(false); open(); } } @@ -546,7 +546,7 @@ bool CDMRNetwork::write(const unsigned char* data, unsigned int length) bool ret = m_socket.write(data, length, m_addr, m_addrLen); if (!ret) { LogError("%s, Socket has failed when writing data to the master, retrying connection", m_name.c_str()); - m_socket.close(); + close(false); open(); return false; } diff --git a/DMRNetwork.h b/DMRNetwork.h index 8e287a5..091f3e4 100644 --- a/DMRNetwork.h +++ b/DMRNetwork.h @@ -57,7 +57,7 @@ public: bool isConnected() const; - void close(); + void close(bool sayGoodbye = true); private: sockaddr_storage m_addr; From daa54d3d328ec5391c3593be7a4f212c5d364350 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Fri, 9 Apr 2021 10:16:52 +0100 Subject: [PATCH 3/3] Don't use default arguments for closing the network connection. --- DMRGateway.cpp | 18 +++++++++--------- DMRNetwork.cpp | 4 ++-- DMRNetwork.h | 4 ++-- Version.h | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/DMRGateway.cpp b/DMRGateway.cpp index f9a4047..e0ac371 100644 --- a/DMRGateway.cpp +++ b/DMRGateway.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1300,32 +1300,32 @@ int CDMRGateway::run() } if (m_dmrNetwork1 != NULL) { - m_dmrNetwork1->close(); + m_dmrNetwork1->close(true); delete m_dmrNetwork1; } if (m_dmrNetwork2 != NULL) { - m_dmrNetwork2->close(); + m_dmrNetwork2->close(true); delete m_dmrNetwork2; } if (m_dmrNetwork3 != NULL) { - m_dmrNetwork3->close(); + m_dmrNetwork3->close(true); delete m_dmrNetwork3; } if (m_dmrNetwork4 != NULL) { - m_dmrNetwork4->close(); + m_dmrNetwork4->close(true); delete m_dmrNetwork4; } if (m_dmrNetwork5 != NULL) { - m_dmrNetwork5->close(); + m_dmrNetwork5->close(true); delete m_dmrNetwork5; } if (m_xlxNetwork != NULL) { - m_xlxNetwork->close(); + m_xlxNetwork->close(true); delete m_xlxNetwork; } @@ -2308,7 +2308,7 @@ bool CDMRGateway::linkXLX(unsigned int number) if (m_xlxNetwork != NULL) { LogMessage("XLX, Disconnecting from XLX%03u", m_xlxNumber); - m_xlxNetwork->close(); + m_xlxNetwork->close(true); delete m_xlxNetwork; } @@ -2345,7 +2345,7 @@ bool CDMRGateway::linkXLX(unsigned int number) void CDMRGateway::unlinkXLX() { if (m_xlxNetwork != NULL) { - m_xlxNetwork->close(); + m_xlxNetwork->close(true); delete m_xlxNetwork; m_xlxNetwork = NULL; } diff --git a/DMRNetwork.cpp b/DMRNetwork.cpp index 872c2fc..144b134 100644 --- a/DMRNetwork.cpp +++ b/DMRNetwork.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2018,2020,2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -370,7 +370,7 @@ void CDMRNetwork::clock(unsigned int ms) the Network sometimes times out and reaches here. We want it to reconnect so... */ LogError("%s, Login to the master has failed, retrying network ...", m_name.c_str()); - close(); + close(false); open(); return; } diff --git a/DMRNetwork.h b/DMRNetwork.h index 091f3e4..08ed438 100644 --- a/DMRNetwork.h +++ b/DMRNetwork.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2018,2020.2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,7 +57,7 @@ public: bool isConnected() const; - void close(bool sayGoodbye = true); + void close(bool sayGoodbye); private: sockaddr_storage m_addr; diff --git a/Version.h b/Version.h index b85724b..1a43e3a 100644 --- a/Version.h +++ b/Version.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20201031"; +const char* VERSION = "20210409"; #endif