From 31d2586e3296d424e51848ada963299b0da89324 Mon Sep 17 00:00:00 2001 From: Dirk Engling Date: Fri, 30 Oct 2026 13:23:39 +0100 Subject: Defer accepts until some data actually is there --- ot_socket.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'ot_socket.c') diff --git a/ot_socket.c b/ot_socket.c index 47ed26d..78a16d2 100644 --- a/ot_socket.c +++ b/ot_socket.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -120,6 +121,25 @@ static int socket_bind_v6(int s, const ot_ip6 ip, uint16_t port, socket_sharing return bind(s, (struct sockaddr *)&sa, sizeof(sa)); } +/* Defer the listening socket reporting it to be ready to accept until enough + sensible data is available for an accept+read pair. Where available. */ +int socket_defer_accept(int s) { +#if defined(TCP_DEFER_ACCEPT) + int patience = OT_CLIENT_TIMEOUT; + + return setsockopt(s, IPPROTO_TCP, TCP_DEFER_ACCEPT, &patience, sizeof(patience)); +#elif defined(SO_ACCEPTFILTER) + struct accept_filter_arg filter; + + memset(&filter, 0, sizeof(filter)); + strcpy(filter.af_name, "httpready"); + return setsockopt(s, SOL_SOCKET, SO_ACCEPTFILTER, &filter, sizeof(filter)); +#else + (void)s; + return -1; +#endif +} + int socket_tcp_listen(const ot_ip6 ip, uint16_t port, socket_sharing sharing) { int s = socket_v6(SOCK_STREAM); -- cgit v1.3