This release contains the following changes since 2.4.0:
- Socket writes no longer block: data that lwIP or mbedTLS refuses is kept in a per-connection buffer and sent from the poll loop, so data the module has accepted is never dropped
- The module stops accepting new data while the free heap runs low, because the reported TCP send buffer does not account for the heap-backed segments behind it
- Reduced the TCP send buffer and receive window on ESP32, ESP32-C3 and ESP32-S3 modules from 64 KiB to 12 segments per socket, which leaves more breathing room for TLS connections
- Connections are terminated instead of being left with a truncated stream when buffered data cannot be stored or the peer stops acknowledging it for more than 4 seconds
- The station now associates with the access point that the scan picked, which decides the node on a mesh network where every node shares one SSID. Reconnects drop that choice again, so an access point that has gone away is not retried forever
- Teardown of a TLS connection that the listener task still owns runs on that task, replacing the global handshake mutex
- Bug fix: Closing or terminating a TLS connection blocked the SPI request handler until the running handshake step had finished, which the Duet reported as SPI timeouts
- Bug fix: Every listen command re-applied the mDNS host name, which made the responder send bye packets and probe the name again, flushing it from peer caches and causing intermittent name resolution failures
- Bug fix: Writes to a connection that the peer had already reset were reported as incomplete
- Bug fix: Reading the TCP control block twice could race lwIP freeing it and crash the module with a LoadProhibited exception
- Bug fix: A fatal TLS alert from the peer is reported as a rejected certificate instead of a raw error code