mirror of
https://github.com/esphome/esphome.git
synced 2026-07-10 08:55:36 +00:00
d0e5035f0ead0fe3e32bb85fbdbf135bbebf74d1
When the client sends 6+ messages during handshake (HelloReq, AuthReq, GetTimeResp, SubscribeLogsReq, DeviceInfoReq, ListEntitiesReq), MAX_MESSAGES_PER_LOOP=5 caused ListEntitiesReq to remain unread in the socket buffer. LWIP's rcvevent counter (used by is_socket_ready) tracks pbuf dequeues, not remaining bytes. When multiple ESPHome messages share a single TCP segment/pbuf, reading all but the last message exhausts rcvevent to 0 while the last message's data remains in LWIP's internal lastdata cache. is_socket_ready() then returns false, and the data is never read — the entity listing silently stalls until something else (like a keepalive ping) triggers new socket activity. Fix: - Track when the read loop hits MAX_MESSAGES_PER_LOOP and retry on the next iteration without the is_socket_ready() gate - Increase MAX_MESSAGES_PER_LOOP from 5 to 10 (decode cost is now 3x cheaper, and we batch 24-34 messages per write) - Move set_nodelay_for_message(false) before try_to_clear_buffer in process_batch_() so NODELAY is set before draining overflow
Description
ESPHome is a system to control your ESP8266/ESP32 by simple yet powerful configuration files and control them remotely through Home Automation systems.
Readme
Multiple Licenses
545 MiB
Languages
C++
60.1%
Python
39.3%
C
0.3%
JavaScript
0.2%
