110#ifdef USE_LWIP_FAST_SELECT
114#include <lwip/priv/sockets_priv.h>
118#include <freertos/FreeRTOS.h>
119#include <freertos/task.h>
136_Static_assert(
sizeof(TaskHandle_t) <= 4,
"TaskHandle_t must be <= 4 bytes for atomic access");
137_Static_assert(
sizeof(netconn_callback) <= 4,
"netconn_callback must be <= 4 bytes for atomic access");
141_Static_assert(
sizeof(((
struct lwip_sock *) 0)->rcvevent) == 2,
142 "rcvevent size changed — update int16_t cast in esphome_lwip_socket_has_data() in lwip_fast_select.h");
146_Static_assert(offsetof(
struct netconn, callback) %
sizeof(netconn_callback) == 0,
147 "netconn.callback must be naturally aligned for atomic access");
148_Static_assert(offsetof(
struct lwip_sock, rcvevent) %
sizeof(((
struct lwip_sock *) 0)->rcvevent) == 0,
149 "lwip_sock.rcvevent must be naturally aligned for atomic access");
153 "lwip_sock.rcvevent offset changed — update ESPHOME_LWIP_SOCK_RCVEVENT_OFFSET in lwip_fast_select.h");
158static netconn_callback s_original_callback = NULL;
160#ifdef USE_OTA_PLATFORM_ESPHOME
161static struct netconn *s_ota_listener_conn = NULL;
165 s_ota_listener_conn = (sock != NULL) ? sock->conn : NULL;
173static void esphome_socket_event_callback(
struct netconn *conn,
enum netconn_evt evt, u16_t
len) {
178 s_original_callback(conn, evt,
len);
184 if (evt == NETCONN_EVT_RCVPLUS) {
185#ifdef USE_OTA_PLATFORM_ESPHOME
188 if (conn == s_ota_listener_conn) {
194 xTaskNotifyGive(task);
207static inline struct lwip_sock *get_sock(
int fd) {
208 struct lwip_sock *sock = lwip_socket_dbg_get_socket(fd);
209 if (sock == NULL || sock->conn == NULL)
221 if (s_original_callback == NULL) {
222 s_original_callback = sock->conn->callback;
227 sock->conn->callback = esphome_socket_event_callback;
231 if (sock == NULL || sock->conn == NULL)
233 if (NETCONNTYPE_GROUP(sock->conn->type) != NETCONN_TCP)
235 if (sock->conn->pcb.tcp == NULL)
238 tcp_nagle_disable(sock->conn->pcb.tcp);
240 tcp_nagle_enable(sock->conn->pcb.tcp);
void esphome_wake_ota_component_any_context(void)
bool esphome_lwip_set_nodelay(struct lwip_sock *sock, bool enable)
Set or clear TCP_NODELAY on a socket's tcp_pcb directly.
void esphome_lwip_hook_socket(struct lwip_sock *sock)
Hook a socket's netconn callback to notify the main loop task on receive events.
struct lwip_sock * esphome_lwip_get_sock(int fd)
Look up a LwIP socket struct from a file descriptor.
void esphome_fast_select_set_ota_listener_sock(struct lwip_sock *sock)
Set the listener netconn that the fast-select callback filters OTA wakes against.
@ ESPHOME_LWIP_SOCK_RCVEVENT_OFFSET
TaskHandle_t esphome_main_task_handle
Main loop task handle and wake helpers — shared between wake.h (C++) and lwip_fast_select....