From c90ab6f72f2c9341be1feba0da3d8e7b6a56bdaa Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Sat, 21 Feb 2026 17:07:46 -0600 Subject: [PATCH] [socket] Remove legacy aliases, fix NETCONN count, add comments - Remove SOCKET_TCP/SOCKET_UDP aliases, use SocketType.UDP everywhere - Fix MEMP_NUM_NETCONN to include listening_tcp (listeners need netconns) - Add comment on listening_tcp minimum (not all components register yet) - Add comment on MAX_LISTENING_SOCKETS_TCP (BK-specific, RTL/LN use MEMP_NUM_TCP_PCB_LISTEN directly) Co-Authored-By: Claude Opus 4.6 --- esphome/components/libretiny/__init__.py | 10 ++++++---- esphome/components/mdns/__init__.py | 2 +- esphome/components/socket/__init__.py | 6 +----- esphome/components/udp/__init__.py | 2 +- esphome/components/wifi/__init__.py | 2 +- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/esphome/components/libretiny/__init__.py b/esphome/components/libretiny/__init__.py index e2b3335491..0daf9733b8 100644 --- a/esphome/components/libretiny/__init__.py +++ b/esphome/components/libretiny/__init__.py @@ -326,7 +326,8 @@ def _configure_lwip(config: dict) -> None: tcp_sockets = max(MIN_TCP_SOCKETS, raw_tcp) udp_sockets = max(MIN_UDP_SOCKETS, raw_udp) # Listening sockets — registered by components (api, ota, web_server_base, etc.) - listening_tcp = max(raw_tcp_listen, 2) # at least 2 (api + ota) + # Not all components register yet, so ensure a minimum of 2 (api + ota baseline). + listening_tcp = max(raw_tcp_listen, 2) # TCP_SND_BUF: ESPAsyncWebServer allocates malloc(tcp_sndbuf()) per # response chunk. At 10×MSS=14.6KB (BK default) this causes OOM (#14095). @@ -356,7 +357,8 @@ def _configure_lwip(config: dict) -> None: # Socket counts — auto-calculated from component registrations f"MAX_SOCKETS_TCP={tcp_sockets}", f"MAX_SOCKETS_UDP={udp_sockets}", - # Listening sockets — auto-calculated from component registrations + # Listening sockets — BK SDK uses this to derive MEMP_NUM_TCP_PCB_LISTEN; + # RTL/LN don't use it, but we set MEMP_NUM_TCP_PCB_LISTEN explicitly below. f"MAX_LISTENING_SOCKETS_TCP={listening_tcp}", # Queued segment limits — derived from 4×MSS buffer size f"TCP_SND_QUEUELEN={tcp_snd_queuelen}", @@ -366,8 +368,8 @@ def _configure_lwip(config: dict) -> None: f"MEMP_NUM_TCP_PCB_LISTEN={listening_tcp}", # BK: =MAX_LISTENING, RTL: 5, LN: 3 # UDP PCB pool — includes wifi.lwip_internal (DHCP + DNS) f"MEMP_NUM_UDP_PCB={udp_sockets}", # BK: 25, RTL/LN: 7 via LT - # Netconn pool — listening sockets are already counted in tcp_sockets - f"MEMP_NUM_NETCONN={tcp_sockets + udp_sockets}", + # Netconn pool — each socket (active + listening) needs a netconn + f"MEMP_NUM_NETCONN={tcp_sockets + udp_sockets + listening_tcp}", # Netbuf pool "MEMP_NUM_NETBUF=4", # BK: 16, RTL: 2 (opt.h), LN: 8 # Inbound message pool diff --git a/esphome/components/mdns/__init__.py b/esphome/components/mdns/__init__.py index c7fb28e766..420e6a60e3 100644 --- a/esphome/components/mdns/__init__.py +++ b/esphome/components/mdns/__init__.py @@ -56,7 +56,7 @@ def _consume_mdns_sockets(config: ConfigType) -> ConfigType: from esphome.components import socket # mDNS needs 2 sockets (IPv4 + IPv6 multicast) - socket.consume_sockets(2, "mdns", socket.SOCKET_UDP)(config) + socket.consume_sockets(2, "mdns", socket.SocketType.UDP)(config) return config diff --git a/esphome/components/socket/__init__.py b/esphome/components/socket/__init__.py index 8fbc0ce302..4204a14747 100644 --- a/esphome/components/socket/__init__.py +++ b/esphome/components/socket/__init__.py @@ -38,10 +38,6 @@ class SocketType(StrEnum): TCP_LISTEN = "tcp_listen" -# Legacy aliases -SOCKET_TCP = SocketType.TCP -SOCKET_UDP = SocketType.UDP - _SOCKET_TYPE_KEYS = { SocketType.TCP: KEY_SOCKET_CONSUMERS_TCP, SocketType.UDP: KEY_SOCKET_CONSUMERS_UDP, @@ -134,7 +130,7 @@ def require_wake_loop_threadsafe() -> None: CORE.data[KEY_WAKE_LOOP_THREADSAFE_REQUIRED] = True cg.add_define("USE_WAKE_LOOP_THREADSAFE") # Consume 1 socket for the shared wake notification socket - consume_sockets(1, "socket.wake_loop_threadsafe", SOCKET_UDP)({}) + consume_sockets(1, "socket.wake_loop_threadsafe", SocketType.UDP)({}) CONFIG_SCHEMA = cv.Schema( diff --git a/esphome/components/udp/__init__.py b/esphome/components/udp/__init__.py index 74a890076e..37dd871a6c 100644 --- a/esphome/components/udp/__init__.py +++ b/esphome/components/udp/__init__.py @@ -73,7 +73,7 @@ def _consume_udp_sockets(config: ConfigType) -> ConfigType: # UDP uses up to 2 sockets: 1 broadcast + 1 listen # Whether each is used depends on code generation, so register worst case - socket.consume_sockets(2, "udp", socket.SOCKET_UDP)(config) + socket.consume_sockets(2, "udp", socket.SocketType.UDP)(config) return config diff --git a/esphome/components/wifi/__init__.py b/esphome/components/wifi/__init__.py index 6edd84e589..5fbf76a22d 100644 --- a/esphome/components/wifi/__init__.py +++ b/esphome/components/wifi/__init__.py @@ -284,7 +284,7 @@ def _consume_wifi_sockets(config: ConfigType) -> ConfigType: # lwIP allocates UDP PCBs for DHCP client and DNS resolver internally. # These are not application sockets but consume MEMP_NUM_UDP_PCB pool entries. - socket.consume_sockets(2, "wifi.lwip_internal", socket.SOCKET_UDP)(config) + socket.consume_sockets(2, "wifi.lwip_internal", socket.SocketType.UDP)(config) return config