From 4d1e58e2bf4506144eca83f948aab7bd067fca1d Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 4 Nov 2020 17:48:28 -0800 Subject: [PATCH 1/4] A few ESP32SPI fixes * Only allow one TLS connection at a time. Nina FW doesn't work well with multiple. * Raise OSError(23) when out of socket slots. * Close a socket when a send doesn't complete. * Don't raise an exception when close fails. --- adafruit_esp32spi/adafruit_esp32spi.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) mode change 100755 => 100644 adafruit_esp32spi/adafruit_esp32spi.py diff --git a/adafruit_esp32spi/adafruit_esp32spi.py b/adafruit_esp32spi/adafruit_esp32spi.py old mode 100755 new mode 100644 index 4c7b1b0..49f840e --- a/adafruit_esp32spi/adafruit_esp32spi.py +++ b/adafruit_esp32spi/adafruit_esp32spi.py @@ -152,6 +152,8 @@ def __init__( self._cs.direction = Direction.OUTPUT self._ready.direction = Direction.INPUT self._reset.direction = Direction.OUTPUT + # Only one TLS socket at a time is supported so track when we already have one. + self._tls_socket = None if self._gpio0: self._gpio0.direction = Direction.INPUT self.reset() @@ -330,11 +332,9 @@ def status(self): (not found), WL_IDLE_STATUS, WL_NO_SSID_AVAIL, WL_SCAN_COMPLETED, WL_CONNECTED, WL_CONNECT_FAILED, WL_CONNECTION_LOST, WL_DISCONNECTED, WL_AP_LISTENING, WL_AP_CONNECTED, WL_AP_FAILED""" - if self._debug: - print("Connection status") resp = self._send_command_get_response(_GET_CONN_STATUS_CMD) if self._debug: - print("Conn status:", resp[0][0]) + print("Connection status:", resp[0][0]) return resp[0][0] # one byte response @property @@ -623,7 +623,7 @@ def get_socket(self): resp = self._send_command_get_response(_GET_SOCKET_CMD) resp = resp[0][0] if resp == 255: - raise RuntimeError("No sockets available") + raise OSError(23) # ENFILE - File table overflow if self._debug: print("Allocated socket #%d" % resp) return resp @@ -635,7 +635,9 @@ def socket_open(self, socket_num, dest, port, conn_mode=TCP_MODE): (dest must be hostname for TLS_MODE!)""" self._socknum_ll[0][0] = socket_num if self._debug: - print("*** Open socket") + print("*** Open socket to", dest, port, conn_mode) + if conn_mode == TLS_MODE and self._tls_socket is not None: + raise OSError(23) # ENFILE - File table overflow port_param = struct.pack(">H", port) if isinstance(dest, str): # use the 5 arg version dest = bytes(dest, "utf-8") @@ -656,6 +658,8 @@ def socket_open(self, socket_num, dest, port, conn_mode=TCP_MODE): ) if resp[0][0] != 1: raise RuntimeError("Could not connect to remote server") + if conn_mode == TLS_MODE: + self._tls_socket = socket_num def socket_status(self, socket_num): """Get the socket connection status, can be SOCKET_CLOSED, SOCKET_LISTEN, @@ -706,6 +710,7 @@ def socket_write(self, socket_num, buffer, conn_mode=TCP_MODE): return if sent != len(buffer): + self.socket_close(socket_num) raise RuntimeError( "Failed to send %d bytes (sent %d)" % (len(buffer), sent) ) @@ -766,9 +771,12 @@ def socket_close(self, socket_num): if self._debug: print("*** Closing socket #%d" % socket_num) self._socknum_ll[0][0] = socket_num - resp = self._send_command_get_response(_STOP_CLIENT_TCP_CMD, self._socknum_ll) - if resp[0][0] != 1: - raise RuntimeError("Failed to close socket") + try: + resp = self._send_command_get_response(_STOP_CLIENT_TCP_CMD, self._socknum_ll) + except RuntimeError: + pass + if socket_num == self._tls_socket: + self._tls_socket = None def start_server( self, port, socket_num, conn_mode=TCP_MODE, ip=None From 1c2ee5c96da68c671b9bb86fec6970096073c4f6 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Wed, 4 Nov 2020 17:53:49 -0800 Subject: [PATCH 2/4] Black --- adafruit_esp32spi/adafruit_esp32spi.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/adafruit_esp32spi/adafruit_esp32spi.py b/adafruit_esp32spi/adafruit_esp32spi.py index 49f840e..819befc 100644 --- a/adafruit_esp32spi/adafruit_esp32spi.py +++ b/adafruit_esp32spi/adafruit_esp32spi.py @@ -623,7 +623,7 @@ def get_socket(self): resp = self._send_command_get_response(_GET_SOCKET_CMD) resp = resp[0][0] if resp == 255: - raise OSError(23) # ENFILE - File table overflow + raise OSError(23) # ENFILE - File table overflow if self._debug: print("Allocated socket #%d" % resp) return resp @@ -637,7 +637,7 @@ def socket_open(self, socket_num, dest, port, conn_mode=TCP_MODE): if self._debug: print("*** Open socket to", dest, port, conn_mode) if conn_mode == TLS_MODE and self._tls_socket is not None: - raise OSError(23) # ENFILE - File table overflow + raise OSError(23) # ENFILE - File table overflow port_param = struct.pack(">H", port) if isinstance(dest, str): # use the 5 arg version dest = bytes(dest, "utf-8") @@ -772,7 +772,9 @@ def socket_close(self, socket_num): print("*** Closing socket #%d" % socket_num) self._socknum_ll[0][0] = socket_num try: - resp = self._send_command_get_response(_STOP_CLIENT_TCP_CMD, self._socknum_ll) + resp = self._send_command_get_response( + _STOP_CLIENT_TCP_CMD, self._socknum_ll + ) except RuntimeError: pass if socket_num == self._tls_socket: From 7c726b9092c259b886162c0125ead6081ae349dd Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Thu, 5 Nov 2020 13:07:28 -0800 Subject: [PATCH 3/4] lint --- adafruit_esp32spi/adafruit_esp32spi.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/adafruit_esp32spi/adafruit_esp32spi.py b/adafruit_esp32spi/adafruit_esp32spi.py index 819befc..4712aca 100644 --- a/adafruit_esp32spi/adafruit_esp32spi.py +++ b/adafruit_esp32spi/adafruit_esp32spi.py @@ -636,7 +636,7 @@ def socket_open(self, socket_num, dest, port, conn_mode=TCP_MODE): self._socknum_ll[0][0] = socket_num if self._debug: print("*** Open socket to", dest, port, conn_mode) - if conn_mode == TLS_MODE and self._tls_socket is not None: + if conn_mode == ESP_SPIcontrol.TLS_MODE and self._tls_socket is not None: raise OSError(23) # ENFILE - File table overflow port_param = struct.pack(">H", port) if isinstance(dest, str): # use the 5 arg version @@ -658,7 +658,7 @@ def socket_open(self, socket_num, dest, port, conn_mode=TCP_MODE): ) if resp[0][0] != 1: raise RuntimeError("Could not connect to remote server") - if conn_mode == TLS_MODE: + if conn_mode == ESP_SPIcontrol.TLS_MODE: self._tls_socket = socket_num def socket_status(self, socket_num): @@ -772,7 +772,7 @@ def socket_close(self, socket_num): print("*** Closing socket #%d" % socket_num) self._socknum_ll[0][0] = socket_num try: - resp = self._send_command_get_response( + self._send_command_get_response( _STOP_CLIENT_TCP_CMD, self._socknum_ll ) except RuntimeError: From 2cc5615f3371069c5d3a17808c15de72ee9df7c8 Mon Sep 17 00:00:00 2001 From: Scott Shawcroft Date: Thu, 5 Nov 2020 13:10:53 -0800 Subject: [PATCH 4/4] black --- adafruit_esp32spi/adafruit_esp32spi.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/adafruit_esp32spi/adafruit_esp32spi.py b/adafruit_esp32spi/adafruit_esp32spi.py index 4712aca..7ea193e 100644 --- a/adafruit_esp32spi/adafruit_esp32spi.py +++ b/adafruit_esp32spi/adafruit_esp32spi.py @@ -772,9 +772,7 @@ def socket_close(self, socket_num): print("*** Closing socket #%d" % socket_num) self._socknum_ll[0][0] = socket_num try: - self._send_command_get_response( - _STOP_CLIENT_TCP_CMD, self._socknum_ll - ) + self._send_command_get_response(_STOP_CLIENT_TCP_CMD, self._socknum_ll) except RuntimeError: pass if socket_num == self._tls_socket: