From 4ba1866fcea1b30739df00b89e1c8beddc7ef222 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 26 Sep 2023 15:18:54 +0200 Subject: [PATCH 1/5] Provided a destructor for lwipClient Provided a destructor that takes care of deallocating the _tcp_client only when allocated with mem_alloc() and not passed in the constructor --- libraries/lwIpWrapper/src/lwipClient.cpp | 19 ++++++++++++++++--- libraries/lwIpWrapper/src/lwipClient.h | 3 +++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/libraries/lwIpWrapper/src/lwipClient.cpp b/libraries/lwIpWrapper/src/lwipClient.cpp index 8facb2525..927df3736 100644 --- a/libraries/lwIpWrapper/src/lwipClient.cpp +++ b/libraries/lwIpWrapper/src/lwipClient.cpp @@ -8,7 +8,7 @@ extern "C" { /* -------------------------------------------------------------------------- */ lwipClient::lwipClient() - : _tcp_client(NULL) + : _tcp_client(NULL), _provided_tcp_client(false) { } /* -------------------------------------------------------------------------- */ @@ -17,15 +17,28 @@ lwipClient::lwipClient() sketches but sock is ignored. */ /* -------------------------------------------------------------------------- */ lwipClient::lwipClient(uint8_t sock) - : _tcp_client(NULL) + : _tcp_client(NULL), _provided_tcp_client(false) + { } /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ lwipClient::lwipClient(struct tcp_struct* tcpClient) + : _tcp_client(tcpClient), _provided_tcp_client(true) + { - _tcp_client = tcpClient; +} +/* -------------------------------------------------------------------------- */ + +/* -------------------------------------------------------------------------- */ +lwipClient::~lwipClient() +{ + stop(); + + if(!_provided_tcp_client) { + mem_free(_tcp_client); + } } /* -------------------------------------------------------------------------- */ diff --git a/libraries/lwIpWrapper/src/lwipClient.h b/libraries/lwIpWrapper/src/lwipClient.h index b3ffe270d..f71fcb097 100644 --- a/libraries/lwIpWrapper/src/lwipClient.h +++ b/libraries/lwIpWrapper/src/lwipClient.h @@ -16,6 +16,7 @@ class lwipClient : public Client { lwipClient(); lwipClient(uint8_t sock); lwipClient(struct tcp_struct* tcpClient); + virtual ~lwipClient(); uint8_t status(); virtual int connect(IPAddress ip, uint16_t port); @@ -68,6 +69,8 @@ class lwipClient : public Client { private: struct tcp_struct* _tcp_client; uint16_t _timeout = 10000; + + const bool _provided_tcp_client; }; #endif From e66f5cf5a032e03d7ef3aefdb460678ae7bd8bdf Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 26 Sep 2023 15:21:09 +0200 Subject: [PATCH 2/5] added check when pbuffer_get_data returns error --- libraries/lwIpWrapper/src/lwipClient.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/lwIpWrapper/src/lwipClient.cpp b/libraries/lwIpWrapper/src/lwipClient.cpp index 927df3736..00bdd6d68 100644 --- a/libraries/lwIpWrapper/src/lwipClient.cpp +++ b/libraries/lwIpWrapper/src/lwipClient.cpp @@ -171,9 +171,13 @@ int lwipClient::read() uint8_t b; if ((_tcp_client != NULL) && (_tcp_client->data.p != NULL)) { __disable_irq(); - pbuffer_get_data(&(_tcp_client->data), &b, 1); + int rv = pbuffer_get_data(&(_tcp_client->data), &b, 1); __enable_irq(); - return b; + if(rv == 1) { + return b; + } else { + return -1; + } } // No data available return -1; From 3f1ee3a1df6a526e87153bef389b90c3a5d3d2ba Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Thu, 28 Sep 2023 14:15:42 +0200 Subject: [PATCH 3/5] added move constructor --- libraries/lwIpWrapper/src/lwipClient.cpp | 18 ++++++++++++++++++ libraries/lwIpWrapper/src/lwipClient.h | 5 ++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libraries/lwIpWrapper/src/lwipClient.cpp b/libraries/lwIpWrapper/src/lwipClient.cpp index 00bdd6d68..ee362223a 100644 --- a/libraries/lwIpWrapper/src/lwipClient.cpp +++ b/libraries/lwIpWrapper/src/lwipClient.cpp @@ -28,6 +28,13 @@ lwipClient::lwipClient(struct tcp_struct* tcpClient) : _tcp_client(tcpClient), _provided_tcp_client(true) { +} + +/* -------------------------------------------------------------------------- */ +lwipClient::lwipClient(lwipClient&& c) noexcept + :_tcp_client(std::move(c._tcp_client)), _provided_tcp_client(c._provided_tcp_client), _timeout(c._timeout) +{ + } /* -------------------------------------------------------------------------- */ @@ -42,6 +49,17 @@ lwipClient::~lwipClient() } /* -------------------------------------------------------------------------- */ +/* -------------------------------------------------------------------------- */ +lwipClient& lwipClient::operator=(lwipClient&& c) { + this->_tcp_client = std::move(c._tcp_client); + this->_provided_tcp_client = c._provided_tcp_client; + this->_timeout = c._timeout; + + return *this; +} + +/* -------------------------------------------------------------------------- */ + /* -------------------------------------------------------------------------- */ int lwipClient::connect(const char* host, uint16_t port) { diff --git a/libraries/lwIpWrapper/src/lwipClient.h b/libraries/lwIpWrapper/src/lwipClient.h index f71fcb097..1ce8290f2 100644 --- a/libraries/lwIpWrapper/src/lwipClient.h +++ b/libraries/lwIpWrapper/src/lwipClient.h @@ -16,8 +16,11 @@ class lwipClient : public Client { lwipClient(); lwipClient(uint8_t sock); lwipClient(struct tcp_struct* tcpClient); + lwipClient(lwipClient&& c); virtual ~lwipClient(); + lwipClient& operator=(lwipClient&& c); + uint8_t status(); virtual int connect(IPAddress ip, uint16_t port); virtual int connect(const char* host, uint16_t port); @@ -70,7 +73,7 @@ class lwipClient : public Client { struct tcp_struct* _tcp_client; uint16_t _timeout = 10000; - const bool _provided_tcp_client; + bool _provided_tcp_client; }; #endif From 804d61dea51bf01274fa688616a5983b52acf98d Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Thu, 28 Sep 2023 14:16:41 +0200 Subject: [PATCH 4/5] made operators more efficient --- libraries/lwIpWrapper/src/lwipClient.cpp | 9 ++++++++- libraries/lwIpWrapper/src/lwipClient.h | 5 +---- libraries/lwIpWrapper/src/lwipTypes.h | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libraries/lwIpWrapper/src/lwipClient.cpp b/libraries/lwIpWrapper/src/lwipClient.cpp index ee362223a..199c2cefb 100644 --- a/libraries/lwIpWrapper/src/lwipClient.cpp +++ b/libraries/lwIpWrapper/src/lwipClient.cpp @@ -259,7 +259,7 @@ uint8_t lwipClient::connected() { /* -------------------------------------------------------------------------- */ uint8_t s = status(); - return ((available() && (s == TCP_CLOSING)) || (s == TCP_CONNECTED) || (s == TCP_ACCEPTED)); + return s != TCP_DISCONNECTED && ((available() && (s == TCP_CLOSING)) || (s == TCP_CONNECTED) || (s == TCP_ACCEPTED)); } /* -------------------------------------------------------------------------- */ @@ -288,6 +288,13 @@ bool lwipClient::operator==(const lwipClient& rhs) return _tcp_client == rhs._tcp_client && _tcp_client->pcb == rhs._tcp_client->pcb; } +/* -------------------------------------------------------------------------- */ +bool lwipClient::operator!=(const lwipClient& rhs) +{ + /* -------------------------------------------------------------------------- */ + return _tcp_client != rhs._tcp_client || _tcp_client->pcb != rhs._tcp_client->pcb; +} + /* This function is not a function defined by Arduino. This is a function specific to the W5100 architecture. To keep the compatibility we leave it and returns always 0. */ diff --git a/libraries/lwIpWrapper/src/lwipClient.h b/libraries/lwIpWrapper/src/lwipClient.h index 1ce8290f2..85d36a847 100644 --- a/libraries/lwIpWrapper/src/lwipClient.h +++ b/libraries/lwIpWrapper/src/lwipClient.h @@ -43,10 +43,7 @@ class lwipClient : public Client { return bool() != value; } virtual bool operator==(const lwipClient&); - virtual bool operator!=(const lwipClient& rhs) - { - return !this->operator==(rhs); - }; + virtual bool operator!=(const lwipClient& rhs); uint8_t getSocketNumber(); virtual uint16_t localPort() { diff --git a/libraries/lwIpWrapper/src/lwipTypes.h b/libraries/lwIpWrapper/src/lwipTypes.h index c108e15c7..3ce6b7678 100644 --- a/libraries/lwIpWrapper/src/lwipTypes.h +++ b/libraries/lwIpWrapper/src/lwipTypes.h @@ -14,6 +14,7 @@ typedef enum { TCP_SENT, TCP_ACCEPTED, TCP_CLOSING, + TCP_DISCONNECTED, } tcp_client_states; /* Struct to store received data */ From 7bf4a56dcaca46d26d03e2b6f3fbbcf8a775608e Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Thu, 28 Sep 2023 14:17:38 +0200 Subject: [PATCH 5/5] added destructor for ssl client --- libraries/SSLClient/src/SSLClient.cpp | 1 + libraries/SSLClient/src/SSLClient.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/SSLClient/src/SSLClient.cpp b/libraries/SSLClient/src/SSLClient.cpp index 6b1c67754..b68036c98 100644 --- a/libraries/SSLClient/src/SSLClient.cpp +++ b/libraries/SSLClient/src/SSLClient.cpp @@ -85,6 +85,7 @@ SSLClient::SSLClient(Client* client, String ca_path) SSLClient::~SSLClient() { stop(); + delete sslclient->client; delete sslclient; } diff --git a/libraries/SSLClient/src/SSLClient.h b/libraries/SSLClient/src/SSLClient.h index ce73e7b0c..a9c95f8d6 100644 --- a/libraries/SSLClient/src/SSLClient.h +++ b/libraries/SSLClient/src/SSLClient.h @@ -46,7 +46,7 @@ class SSLClient : public Client SSLClient(); SSLClient(Client* client); SSLClient(Client* client, String ca_path); - ~SSLClient(); + virtual ~SSLClient(); void setClient(Client& client);