ESPHome 2026.3.0
Loading...
Searching...
No Matches
lwip_sockets_impl.h
Go to the documentation of this file.
1#pragma once
3
4#ifdef USE_SOCKET_IMPL_LWIP_SOCKETS
5
6#include <memory>
7#include <span>
8
10#include "headers.h"
11
12#ifdef USE_LWIP_FAST_SELECT
14#endif
15
16namespace esphome::socket {
17
19 public:
20 LwIPSocketImpl(int fd, bool monitor_loop = false);
22 LwIPSocketImpl(const LwIPSocketImpl &) = delete;
24
25 int connect(const struct sockaddr *addr, socklen_t addrlen) { return lwip_connect(this->fd_, addr, addrlen); }
26 std::unique_ptr<LwIPSocketImpl> accept(struct sockaddr *addr, socklen_t *addrlen) {
27 int fd = lwip_accept(this->fd_, addr, addrlen);
28 if (fd == -1)
29 return {};
30 return make_unique<LwIPSocketImpl>(fd, false);
31 }
32 std::unique_ptr<LwIPSocketImpl> accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen) {
33 int fd = lwip_accept(this->fd_, addr, addrlen);
34 if (fd == -1)
35 return {};
36 return make_unique<LwIPSocketImpl>(fd, true);
37 }
38
39 int bind(const struct sockaddr *addr, socklen_t addrlen) { return lwip_bind(this->fd_, addr, addrlen); }
40 int close();
41 int shutdown(int how) { return lwip_shutdown(this->fd_, how); }
42
43 int getpeername(struct sockaddr *addr, socklen_t *addrlen) { return lwip_getpeername(this->fd_, addr, addrlen); }
44 int getsockname(struct sockaddr *addr, socklen_t *addrlen) { return lwip_getsockname(this->fd_, addr, addrlen); }
45
47 size_t getpeername_to(std::span<char, SOCKADDR_STR_LEN> buf);
49 size_t getsockname_to(std::span<char, SOCKADDR_STR_LEN> buf);
50
51 int getsockopt(int level, int optname, void *optval, socklen_t *optlen) {
52 return lwip_getsockopt(this->fd_, level, optname, optval, optlen);
53 }
54 int setsockopt(int level, int optname, const void *optval, socklen_t optlen) {
55#if defined(USE_LWIP_FAST_SELECT) && defined(CONFIG_LWIP_TCPIP_CORE_LOCKING)
56 // Fast path for TCP_NODELAY: directly set the pcb flag under the TCPIP core lock,
57 // bypassing lwip_setsockopt overhead (socket lookups, hook, switch cascade, refcounting).
58 if (level == IPPROTO_TCP && optname == TCP_NODELAY && optlen == sizeof(int) && optval != nullptr) {
59 LwIPLock lock;
60 if (esphome_lwip_set_nodelay(this->cached_sock_, *reinterpret_cast<const int *>(optval) != 0))
61 return 0;
62 }
63#endif
64 return lwip_setsockopt(this->fd_, level, optname, optval, optlen);
65 }
66 int listen(int backlog) { return lwip_listen(this->fd_, backlog); }
67 ssize_t read(void *buf, size_t len) { return lwip_read(this->fd_, buf, len); }
68 ssize_t recvfrom(void *buf, size_t len, sockaddr *addr, socklen_t *addr_len) {
69 return lwip_recvfrom(this->fd_, buf, len, 0, addr, addr_len);
70 }
71 ssize_t readv(const struct iovec *iov, int iovcnt) { return lwip_readv(this->fd_, iov, iovcnt); }
72 ssize_t write(const void *buf, size_t len) { return lwip_write(this->fd_, buf, len); }
73 ssize_t send(const void *buf, size_t len, int flags) { return lwip_send(this->fd_, buf, len, flags); }
74 ssize_t writev(const struct iovec *iov, int iovcnt) { return lwip_writev(this->fd_, iov, iovcnt); }
75 ssize_t sendto(const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) {
76 return lwip_sendto(this->fd_, buf, len, flags, to, tolen);
77 }
78 int setblocking(bool blocking);
79 int loop() { return 0; }
80
81 bool ready() const;
82
83 int get_fd() const { return this->fd_; }
84
85 protected:
86 int fd_{-1};
87#ifdef USE_LWIP_FAST_SELECT
88 struct lwip_sock *cached_sock_{nullptr}; // Cached for direct rcvevent read in ready()
89#endif
90 bool closed_{false};
91 bool loop_monitored_{false};
92};
93
94} // namespace esphome::socket
95
96#endif // USE_SOCKET_IMPL_LWIP_SOCKETS
Helper class to lock the lwIP TCPIP core when making lwIP API calls from non-TCPIP threads.
Definition helpers.h:1810
int getsockname(struct sockaddr *addr, socklen_t *addrlen)
size_t getsockname_to(std::span< char, SOCKADDR_STR_LEN > buf)
Format local address into a fixed-size buffer (no heap allocation)
int setsockopt(int level, int optname, const void *optval, socklen_t optlen)
int connect(const struct sockaddr *addr, socklen_t addrlen)
ssize_t sendto(const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen)
ssize_t recvfrom(void *buf, size_t len, sockaddr *addr, socklen_t *addr_len)
ssize_t send(const void *buf, size_t len, int flags)
int getsockopt(int level, int optname, void *optval, socklen_t *optlen)
ssize_t read(void *buf, size_t len)
ssize_t writev(const struct iovec *iov, int iovcnt)
int bind(const struct sockaddr *addr, socklen_t addrlen)
LwIPSocketImpl(const LwIPSocketImpl &)=delete
std::unique_ptr< LwIPSocketImpl > accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen)
std::unique_ptr< LwIPSocketImpl > accept(struct sockaddr *addr, socklen_t *addrlen)
LwIPSocketImpl(int fd, bool monitor_loop=false)
int getpeername(struct sockaddr *addr, socklen_t *addrlen)
ssize_t readv(const struct iovec *iov, int iovcnt)
size_t getpeername_to(std::span< char, SOCKADDR_STR_LEN > buf)
Format peer address into a fixed-size buffer (no heap allocation)
LwIPSocketImpl & operator=(const LwIPSocketImpl &)=delete
ssize_t write(const void *buf, size_t len)
uint16_t flags
uint16_t addr_len
uint32_t socklen_t
Definition headers.h:99
__int64 ssize_t
Definition httplib.h:178
bool esphome_lwip_set_nodelay(struct lwip_sock *sock, bool enable)
Set or clear TCP_NODELAY on a socket's tcp_pcb directly.
std::string size_t len
Definition helpers.h:892