From 3cea5c9b43250b031086f04faae9368ca380f310 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:21:37 +0200 Subject: [PATCH 01/19] Adopt SocketAddress for host --- libraries/WiFi/src/WiFiUdp.cpp | 7 +++---- libraries/WiFi/src/WiFiUdp.h | 3 +-- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 24be84bf6..2609f32dd 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -39,10 +39,9 @@ void arduino::WiFiUDP::stop() { // int arduino::WiFiUDP::beginPacket(IPAddress ip, uint16_t port) { // } -int arduino::WiFiUDP::beginPacket(const char *host, uint16_t port) { - _host = host; - _port = port; - +int arduino::WiFiUDP::beginPacket(IPAddress host, uint16_t port) { + nsapi_addr_t convertedHost = {NSAPI_IPv4, {host[0], host[1], host[2], host[3]}}; + _host = SocketAddress(convertedHost, port); return 1; } diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index 362e6ef8b..f5efdd94a 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -33,8 +33,7 @@ namespace arduino { class WiFiUDP : public UDP { private: UDPSocket _socket; // Mbed OS socket - const char *_host; // Host to be used to send data (todo: switch to SocketAddress) - uint16_t _port; // Port to be used to send data (^) + SocketAddress _host; // Host to be used to send data uint8_t* _packet_buffer; // Raw packet buffer (contains data we got from the UDPSocket) From 77da0ab1d3a7ff4659d2800a8cf6aaac93f678b3 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:22:04 +0200 Subject: [PATCH 02/19] Implement available function --- libraries/WiFi/src/WiFiUdp.cpp | 4 ++++ libraries/WiFi/src/WiFiUdp.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 2609f32dd..dd52c35c6 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -82,6 +82,10 @@ int arduino::WiFiUDP::parsePacket() { return 1; } +int arduino::WiFiUDP::available() { + return _current_packet_size; +} + // Read a single byte from the current packet int arduino::WiFiUDP::read() { // no current packet... diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index f5efdd94a..0dfad8319 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -70,7 +70,7 @@ class WiFiUDP : public UDP { // Returns the size of the packet in bytes, or 0 if no packets are available virtual int parsePacket(); // Number of bytes remaining in the current packet - // virtual int available(); + virtual int available(); // Read a single byte from the current packet virtual int read(); // Read up to len bytes from the current packet and place them into buffer From 575106d776d5a4382bbefe4ede5caf255a26992a Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:23:28 +0200 Subject: [PATCH 03/19] Implement remoteIP function --- libraries/WiFi/src/WiFiUdp.cpp | 11 +++++++++++ libraries/WiFi/src/WiFiUdp.h | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index dd52c35c6..015e397b5 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -150,4 +150,15 @@ int arduino::WiFiUDP::read(unsigned char* buffer, size_t len) { _current_packet += len; return len; +} + +IPAddress arduino::WiFiUDP::remoteIP() { + SocketAddress remoteAddress(""); + + if(_socket.getpeername(&remoteAddress)) != NSAPI_ERROR_OK){ + return nullptr; + } + + nsapi_addr_t address = remoteAddress.get_addr(); + return IPAddress(address[1][0], address[1][1], address[1][2], address[1][3]); } \ No newline at end of file diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index 0dfad8319..65f021ed3 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -84,7 +84,7 @@ class WiFiUDP : public UDP { // virtual void flush(); // Finish reading the current packet // Return the IP address of the host who sent the current incoming packet - // virtual IPAddress remoteIP(); + virtual IPAddress remoteIP(); // // Return the port of the host who sent the current incoming packet // virtual uint16_t remotePort(); }; From 03c1dc8b3a3898ff6c45a35aa2631fd191671feb Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:29:57 +0200 Subject: [PATCH 04/19] Adopt IPAdress for beginPacket --- libraries/WiFi/src/WiFiUdp.cpp | 15 ++++++++------- libraries/WiFi/src/WiFiUdp.h | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 015e397b5..7128d01a3 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -35,16 +35,17 @@ void arduino::WiFiUDP::stop() { _socket.close(); } -// we should get the octets out of the IPAddress... there's nothing for it right now -// int arduino::WiFiUDP::beginPacket(IPAddress ip, uint16_t port) { -// } - -int arduino::WiFiUDP::beginPacket(IPAddress host, uint16_t port) { - nsapi_addr_t convertedHost = {NSAPI_IPv4, {host[0], host[1], host[2], host[3]}}; - _host = SocketAddress(convertedHost, port); +int arduino::WiFiUDP::beginPacket(IPAddress ip, uint16_t port) { + nsapi_addr_t convertedIP = {NSAPI_IPv4, {ip[0], ip[1], ip[2], ip[3]}}; + _host = SocketAddress(convertedIP, port); return 1; } +int arduino::WiFiUDP::beginPacket(const char *host, uint16_t port) { + _host = SocketAddress(host, port); + return 1; +} + int arduino::WiFiUDP::endPacket() { return 1; } diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index 65f021ed3..9b80632e4 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -52,7 +52,7 @@ class WiFiUDP : public UDP { // Start building up a packet to send to the remote host specific in ip and port // Returns 1 if successful, 0 if there was a problem with the supplied IP address or port - // virtual int beginPacket(IPAddress ip, uint16_t port); + virtual int beginPacket(IPAddress ip, uint16_t port); // Start building up a packet to send to the remote host specific in host and port // Returns 1 if successful, 0 if there was a problem resolving the hostname or port virtual int beginPacket(const char *host, uint16_t port); From 6ade5136e2564b9d7bca5f8d4efa34f77e461441 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:30:39 +0200 Subject: [PATCH 05/19] Implement remotePort function --- libraries/WiFi/src/WiFiUdp.cpp | 10 ++++++++++ libraries/WiFi/src/WiFiUdp.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 7128d01a3..d75e14d72 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -162,4 +162,14 @@ IPAddress arduino::WiFiUDP::remoteIP() { nsapi_addr_t address = remoteAddress.get_addr(); return IPAddress(address[1][0], address[1][1], address[1][2], address[1][3]); +} + +uint16_t arduino::WiFiUDP::remotePort() { + SocketAddress remoteAddress(""); + + if(_socket.getpeername(&remoteAddress)) != NSAPI_ERROR_OK){ + return nullptr; + } + + return remoteAddress.get_port(); } \ No newline at end of file diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index 9b80632e4..efaf1f8bb 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -86,7 +86,7 @@ class WiFiUDP : public UDP { // Return the IP address of the host who sent the current incoming packet virtual IPAddress remoteIP(); // // Return the port of the host who sent the current incoming packet - // virtual uint16_t remotePort(); + virtual uint16_t remotePort(); }; } From b4227f5267db3e33adc7d270f3af98636a2f1eb8 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:47:26 +0200 Subject: [PATCH 06/19] Add stub for flush --- libraries/WiFi/src/WiFiUdp.cpp | 5 +++++ libraries/WiFi/src/WiFiUdp.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index d75e14d72..060e4557e 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -172,4 +172,9 @@ uint16_t arduino::WiFiUDP::remotePort() { } return remoteAddress.get_port(); +} + +void arduino::WiFiUDP::flush(){ + // TODO: a real check to ensure transmission has been completed +} } \ No newline at end of file diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index efaf1f8bb..90e9de1ef 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -81,7 +81,7 @@ class WiFiUDP : public UDP { virtual int read(char* buffer, size_t len) { return read((unsigned char*)buffer, len); }; // Return the next byte from the current packet without moving on to the next byte // virtual int peek(); - // virtual void flush(); // Finish reading the current packet + virtual void flush(); // Finish reading the current packet // Return the IP address of the host who sent the current incoming packet virtual IPAddress remoteIP(); From c63d4418f32015045e7bf09cc0f8e5608ebb26f0 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:48:19 +0200 Subject: [PATCH 07/19] Implement peek function --- libraries/WiFi/src/WiFiUdp.cpp | 7 +++++++ libraries/WiFi/src/WiFiUdp.h | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 060e4557e..62952e40b 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -177,4 +177,11 @@ uint16_t arduino::WiFiUDP::remotePort() { void arduino::WiFiUDP::flush(){ // TODO: a real check to ensure transmission has been completed } + +int arduino::WiFiUDP::peek(){ + if (_current_packet_size < 1){ + return -1; + } + + return _current_packet[0]; } \ No newline at end of file diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index 90e9de1ef..2f94b7152 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -80,7 +80,7 @@ class WiFiUDP : public UDP { // Returns the number of characters read, or 0 if none are available virtual int read(char* buffer, size_t len) { return read((unsigned char*)buffer, len); }; // Return the next byte from the current packet without moving on to the next byte - // virtual int peek(); + virtual int peek(); virtual void flush(); // Finish reading the current packet // Return the IP address of the host who sent the current incoming packet From 33d5be39c6216bde02cf9910455b3adf417ec503 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:48:33 +0200 Subject: [PATCH 08/19] Use SocketAddress in write functions --- libraries/WiFi/src/WiFiUdp.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 62952e40b..43dc80ac6 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -52,15 +52,13 @@ int arduino::WiFiUDP::endPacket() { // Write a single byte into the packet size_t arduino::WiFiUDP::write(uint8_t byte) { - uint8_t buffer[1] = { byte }; - SocketAddress addr(_host, _port); - return _socket.sendto(addr, buffer, 1); + uint8_t buffer[1] = { byte }; + return _socket.sendto(_host, buffer, 1); } // Write size bytes from buffer into the packet -size_t arduino::WiFiUDP::write(const uint8_t *buffer, size_t size) { - SocketAddress addr(_host, _port); - return _socket.sendto(addr, buffer, size); +size_t arduino::WiFiUDP::write(const uint8_t *buffer, size_t size) { + return _socket.sendto(_host, buffer, size); } int arduino::WiFiUDP::parsePacket() { From 211a57a5de429a6b553997926d470adad3b1dfde Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:54:45 +0200 Subject: [PATCH 09/19] Fix typos --- libraries/WiFi/src/WiFiUdp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 43dc80ac6..59e8bfdb9 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -154,7 +154,7 @@ int arduino::WiFiUDP::read(unsigned char* buffer, size_t len) { IPAddress arduino::WiFiUDP::remoteIP() { SocketAddress remoteAddress(""); - if(_socket.getpeername(&remoteAddress)) != NSAPI_ERROR_OK){ + if(_socket.getpeername(&remoteAddress) != NSAPI_ERROR_OK){ return nullptr; } @@ -165,7 +165,7 @@ IPAddress arduino::WiFiUDP::remoteIP() { uint16_t arduino::WiFiUDP::remotePort() { SocketAddress remoteAddress(""); - if(_socket.getpeername(&remoteAddress)) != NSAPI_ERROR_OK){ + if(_socket.getpeername(&remoteAddress) != NSAPI_ERROR_OK){ return nullptr; } From 55c050c4c049162916a761fe4761ec72e469a807 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 12:55:34 +0200 Subject: [PATCH 10/19] Correctly read bytes from remote IP --- libraries/WiFi/src/WiFiUdp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 59e8bfdb9..289b10154 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -159,7 +159,7 @@ IPAddress arduino::WiFiUDP::remoteIP() { } nsapi_addr_t address = remoteAddress.get_addr(); - return IPAddress(address[1][0], address[1][1], address[1][2], address[1][3]); + return IPAddress(address.bytes[0], address.bytes[1], address.bytes[2], address.bytes[3]); } uint16_t arduino::WiFiUDP::remotePort() { From a2bc22aed04238036e48cf27a9c3c0dc7b9bf5ac Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 13:01:42 +0200 Subject: [PATCH 11/19] Use correct error return code for remotePort --- libraries/WiFi/src/WiFiUdp.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 289b10154..774eb6b85 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -166,7 +166,7 @@ uint16_t arduino::WiFiUDP::remotePort() { SocketAddress remoteAddress(""); if(_socket.getpeername(&remoteAddress) != NSAPI_ERROR_OK){ - return nullptr; + return -1; } return remoteAddress.get_port(); From fd67bf6bea1dc3bdc940ef2b5098852053942972 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 13:30:58 +0200 Subject: [PATCH 12/19] Fix incorrect use of getpeername --- libraries/WiFi/src/WiFiUdp.cpp | 20 ++++---------------- libraries/WiFi/src/WiFiUdp.h | 1 + 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 774eb6b85..145344c07 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -62,7 +62,7 @@ size_t arduino::WiFiUDP::write(const uint8_t *buffer, size_t size) { } int arduino::WiFiUDP::parsePacket() { - nsapi_size_or_error_t ret = _socket.recvfrom(NULL, _packet_buffer, WIFI_UDP_BUFFER_SIZE); + nsapi_size_or_error_t ret = _socket.recvfrom(&_remoteHost, _packet_buffer, WIFI_UDP_BUFFER_SIZE); if (ret == NSAPI_ERROR_WOULD_BLOCK) { // no data @@ -152,24 +152,12 @@ int arduino::WiFiUDP::read(unsigned char* buffer, size_t len) { } IPAddress arduino::WiFiUDP::remoteIP() { - SocketAddress remoteAddress(""); - - if(_socket.getpeername(&remoteAddress) != NSAPI_ERROR_OK){ - return nullptr; - } - - nsapi_addr_t address = remoteAddress.get_addr(); + nsapi_addr_t address = _remoteHost.get_addr(); return IPAddress(address.bytes[0], address.bytes[1], address.bytes[2], address.bytes[3]); } -uint16_t arduino::WiFiUDP::remotePort() { - SocketAddress remoteAddress(""); - - if(_socket.getpeername(&remoteAddress) != NSAPI_ERROR_OK){ - return -1; - } - - return remoteAddress.get_port(); +uint16_t arduino::WiFiUDP::remotePort() { + return _remoteHost.get_port(); } void arduino::WiFiUDP::flush(){ diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index 2f94b7152..be4112374 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -34,6 +34,7 @@ class WiFiUDP : public UDP { private: UDPSocket _socket; // Mbed OS socket SocketAddress _host; // Host to be used to send data + SocketAddress _remoteHost; // Remote host that sent incoming packets uint8_t* _packet_buffer; // Raw packet buffer (contains data we got from the UDPSocket) From c8429774a73e1e534949487a57b5f57a103f1655 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Fri, 10 Jul 2020 14:08:55 +0200 Subject: [PATCH 13/19] Better error handling for parsePacket --- libraries/WiFi/src/WiFiUdp.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 145344c07..622256d0d 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -67,11 +67,14 @@ int arduino::WiFiUDP::parsePacket() { if (ret == NSAPI_ERROR_WOULD_BLOCK) { // no data return 0; + } else if(ret == NSAPI_ERROR_NO_SOCKET){ + // socket was not created correctly. + return -1; } // error codes below zero are errors else if (ret <= 0) { // something else went wrong, need some tracing info... - return 0; + return -1; } // set current packet states From 52fc34947352d77d91e47d997322cd501ed7d3e4 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Sat, 11 Jul 2020 19:05:30 +0200 Subject: [PATCH 14/19] Fix memory leak --- libraries/WiFi/src/WiFiUdp.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 622256d0d..9f822de6a 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -7,10 +7,10 @@ extern WiFiClass WiFi; #endif arduino::WiFiUDP::WiFiUDP() { - _packet_buffer = (uint8_t*)malloc(WIFI_UDP_BUFFER_SIZE); + _packet_buffer = new uint8_t[WIFI_UDP_BUFFER_SIZE]; _current_packet = NULL; _current_packet_size = 0; - // if this malloc fails then ::begin will fail + // if this allocation fails then ::begin will fail } uint8_t arduino::WiFiUDP::begin(uint16_t port) { @@ -33,6 +33,7 @@ uint8_t arduino::WiFiUDP::begin(uint16_t port) { void arduino::WiFiUDP::stop() { _socket.close(); + delete[] _packet_buffer; } int arduino::WiFiUDP::beginPacket(IPAddress ip, uint16_t port) { From d4e9282e4a0b36597fb3038b58153dc688688ae7 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Sat, 11 Jul 2020 19:06:21 +0200 Subject: [PATCH 15/19] Bind socket to port --- libraries/WiFi/src/WiFiUdp.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 9f822de6a..d97f96818 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -21,6 +21,10 @@ uint8_t arduino::WiFiUDP::begin(uint16_t port) { return 0; } + if (_socket.bind(port) < 0) { + return 0; //Failed to bind UDP Socket to port + } + if (!_packet_buffer) { return 0; } From 8456368a2fbff164d2983fbe7e25ef3114fb294c Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Sat, 11 Jul 2020 19:56:41 +0200 Subject: [PATCH 16/19] Return actual packet size --- libraries/WiFi/src/WiFiUdp.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index d97f96818..ce0d84918 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -86,7 +86,7 @@ int arduino::WiFiUDP::parsePacket() { _current_packet = _packet_buffer; _current_packet_size = ret; - return 1; + return _current_packet_size; } int arduino::WiFiUDP::available() { @@ -106,7 +106,7 @@ int arduino::WiFiUDP::read() { // check for overflow if (_current_packet > _packet_buffer + _current_packet_size) { // try reading the next packet... - if (parsePacket() == 1) { + if (parsePacket() > 0) { // if so, read first byte of next packet; return read(); } @@ -141,7 +141,7 @@ int arduino::WiFiUDP::read(unsigned char* buffer, size_t len) { // at the end of the packet? if (max_bytes == 0) { // try read next packet... - if (parsePacket() == 1) { + if (parsePacket() > 0) { return read(buffer, len); } else { From c171117301c9dddc78baf9025a2c36491c77111f Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Sun, 12 Jul 2020 11:00:30 +0200 Subject: [PATCH 17/19] Add destructor for memory cleanup --- libraries/WiFi/src/WiFiUdp.cpp | 7 +++++-- libraries/WiFi/src/WiFiUdp.h | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index ce0d84918..53a75da97 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -13,6 +13,10 @@ arduino::WiFiUDP::WiFiUDP() { // if this allocation fails then ::begin will fail } +arduino::WiFiUDP::~WiFiUDP() { + delete[] _packet_buffer; +} + uint8_t arduino::WiFiUDP::begin(uint16_t port) { // success = 1, fail = 0 @@ -36,8 +40,7 @@ uint8_t arduino::WiFiUDP::begin(uint16_t port) { } void arduino::WiFiUDP::stop() { - _socket.close(); - delete[] _packet_buffer; + _socket.close(); } int arduino::WiFiUDP::beginPacket(IPAddress ip, uint16_t port) { diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index be4112374..f72b118e6 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -45,6 +45,7 @@ class WiFiUDP : public UDP { public: WiFiUDP(); // Constructor + ~WiFiUDP(); virtual uint8_t begin(uint16_t); // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use // virtual uint8_t beginMulticast(IPAddress, uint16_t); // initialize, start listening on specified multicast IP address and port. Returns 1 if successful, 0 if there are no sockets available to use virtual void stop(); // Finish with the UDP socket From 9f3c329f3eae344fe94b9c3c983343df095b1024 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Sun, 12 Jul 2020 11:07:39 +0200 Subject: [PATCH 18/19] Add return code for beginPacket --- libraries/WiFi/src/WiFiUdp.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 53a75da97..2f719120b 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -46,12 +46,14 @@ void arduino::WiFiUDP::stop() { int arduino::WiFiUDP::beginPacket(IPAddress ip, uint16_t port) { nsapi_addr_t convertedIP = {NSAPI_IPv4, {ip[0], ip[1], ip[2], ip[3]}}; _host = SocketAddress(convertedIP, port); - return 1; + //If IP is null and port is 0 the initialization failed + return (_host.get_ip_address() == nullptr && _host.get_port() == 0) ? 0 : 1; } int arduino::WiFiUDP::beginPacket(const char *host, uint16_t port) { _host = SocketAddress(host, port); - return 1; + //If IP is null and port is 0 the initialization failed + return (_host.get_ip_address() == nullptr && _host.get_port() == 0) ? 0 : 1; } int arduino::WiFiUDP::endPacket() { From 203af56939bad17253d1dfb88bf789c7c14e3c68 Mon Sep 17 00:00:00 2001 From: Sebastian Hunkeler Date: Mon, 20 Jul 2020 09:52:22 +0200 Subject: [PATCH 19/19] Enable multicast groups --- libraries/WiFi/src/WiFiUdp.cpp | 16 ++++++++++++++++ libraries/WiFi/src/WiFiUdp.h | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiUdp.cpp b/libraries/WiFi/src/WiFiUdp.cpp index 2f719120b..3461fabf2 100644 --- a/libraries/WiFi/src/WiFiUdp.cpp +++ b/libraries/WiFi/src/WiFiUdp.cpp @@ -39,6 +39,22 @@ uint8_t arduino::WiFiUDP::begin(uint16_t port) { return 1; } +uint8_t arduino::WiFiUDP::beginMulticast(IPAddress ip, uint16_t port) { + // success = 1, fail = 0 + if(begin(port) != 1){ + return 0; + } + + nsapi_addr_t multicastGroup = {NSAPI_IPv4, {ip[0], ip[1], ip[2], ip[3]}}; + + if (_socket.join_multicast_group(SocketAddress(multicastGroup)) != NSAPI_ERROR_OK) { + printf("Error joining the multicast group\n"); + return 0; + } + + return 1; +} + void arduino::WiFiUDP::stop() { _socket.close(); } diff --git a/libraries/WiFi/src/WiFiUdp.h b/libraries/WiFi/src/WiFiUdp.h index f72b118e6..3796c5f9b 100644 --- a/libraries/WiFi/src/WiFiUdp.h +++ b/libraries/WiFi/src/WiFiUdp.h @@ -47,7 +47,7 @@ class WiFiUDP : public UDP { WiFiUDP(); // Constructor ~WiFiUDP(); virtual uint8_t begin(uint16_t); // initialize, start listening on specified port. Returns 1 if successful, 0 if there are no sockets available to use - // virtual uint8_t beginMulticast(IPAddress, uint16_t); // initialize, start listening on specified multicast IP address and port. Returns 1 if successful, 0 if there are no sockets available to use + virtual uint8_t beginMulticast(IPAddress, uint16_t); // initialize, start listening on specified multicast IP address and port. Returns 1 if successful, 0 if there are no sockets available to use virtual void stop(); // Finish with the UDP socket // Sending UDP packets