ESPHome 2026.3.0
Loading...
Searching...
No Matches
headers.h
Go to the documentation of this file.
1#pragma once
3
4// Helper file to include all socket-related system headers (or use our own
5// definitions where system ones don't exist)
6
7#ifdef USE_SOCKET_IMPL_LWIP_TCP
8
9#define LWIP_INTERNAL
10#include "lwip/inet.h"
11#include <cerrno>
12#include <cstdint>
13#include <sys/types.h>
14
15/* Address families. */
16#define AF_UNSPEC 0
17#define AF_INET 2
18#define PF_INET AF_INET
19#define PF_UNSPEC AF_UNSPEC
20
21#define IPPROTO_IP 0
22#define IPPROTO_TCP 6
23
24#if LWIP_IPV6
25#define AF_INET6 10
26#define PF_INET6 AF_INET6
27
28#define IPPROTO_IPV6 41
29#define IPPROTO_ICMPV6 58
30#endif
31
32#define TCP_NODELAY 0x01
33
34#define F_GETFL 3
35#define F_SETFL 4
36
37#ifdef O_NONBLOCK
38#undef O_NONBLOCK
39#endif
40#define O_NONBLOCK 1
41
42#define SHUT_RD 0
43#define SHUT_WR 1
44#define SHUT_RDWR 2
45
46/* Socket protocol types (TCP/UDP/RAW) */
47#define SOCK_STREAM 1
48#define SOCK_DGRAM 2
49#define SOCK_RAW 3
50
51#define SO_REUSEADDR 0x0004 /* Allow local address reuse */
52#define SO_KEEPALIVE 0x0008 /* keep connections alive */
53#define SO_BROADCAST 0x0020 /* permit to send and to receive broadcast messages (see IP_SOF_BROADCAST option) */
54#define SO_RCVTIMEO 0x1006 /* receive timeout */
55#define SO_SNDTIMEO 0x1005 /* send timeout */
56
57#define SOL_SOCKET 0xfff /* options for socket level */
58
59using sa_family_t = uint8_t;
60using in_port_t = uint16_t;
61
62// NOLINTNEXTLINE(readability-identifier-naming)
64 uint8_t sin_len;
67 struct in_addr sin_addr;
68#define SIN_ZERO_LEN 8
69 char sin_zero[SIN_ZERO_LEN];
70};
71
72#if LWIP_IPV6
73// NOLINTNEXTLINE(readability-identifier-naming)
75 uint8_t sin6_len; /* length of this structure */
76 sa_family_t sin6_family; /* AF_INET6 */
77 in_port_t sin6_port; /* Transport layer port # */
78 uint32_t sin6_flowinfo; /* IPv6 flow information */
79 struct in6_addr sin6_addr; /* IPv6 address */
80 uint32_t sin6_scope_id; /* Set of interfaces for scope */
81};
82#endif
83
84// NOLINTNEXTLINE(readability-identifier-naming)
85struct sockaddr {
86 uint8_t sa_len;
88 char sa_data[14];
89};
90
91// NOLINTNEXTLINE(readability-identifier-naming)
100
101// NOLINTNEXTLINE(readability-identifier-naming)
102struct iovec {
103 void *iov_base;
104 size_t iov_len;
105};
106
107#if defined(USE_ESP8266) || defined(USE_RP2040)
108// arduino-esp8266 declares a global vars called INADDR_NONE/ANY which are invalid with the define
109#ifdef INADDR_ANY
110#undef INADDR_ANY
111#endif
112#ifdef INADDR_NONE
113#undef INADDR_NONE
114#endif
115
116#define ESPHOME_INADDR_ANY ((uint32_t) 0x00000000UL)
117#define ESPHOME_INADDR_NONE ((uint32_t) 0xFFFFFFFFUL)
118#else // !USE_ESP8266
119#define ESPHOME_INADDR_ANY INADDR_ANY
120#define ESPHOME_INADDR_NONE INADDR_NONE
121#endif
122
123#endif // USE_SOCKET_IMPL_LWIP_TCP
124
125#ifdef USE_SOCKET_IMPL_LWIP_SOCKETS
126
127// standard lwIP's compatibility macros will interfere
128// with Socket class function names - disable the macros
129// and use real function names instead
130#undef LWIP_COMPAT_SOCKETS
131#define LWIP_COMPAT_SOCKETS 0
132
133#include "lwip/sockets.h"
134#include <sys/types.h>
135
136#ifdef USE_ARDUINO
137// arduino-esp32 declares a global var called INADDR_NONE which is replaced
138// by the define
139#ifdef INADDR_NONE
140#undef INADDR_NONE
141#endif
142// not defined for ESP32
143using socklen_t = uint32_t;
144
145#define ESPHOME_INADDR_ANY ((uint32_t) 0x00000000UL)
146#define ESPHOME_INADDR_NONE ((uint32_t) 0xFFFFFFFFUL)
147#else // !USE_ESP32
148#define ESPHOME_INADDR_ANY INADDR_ANY
149#define ESPHOME_INADDR_NONE INADDR_NONE
150#endif
151
152#endif // USE_SOCKET_IMPL_LWIP_SOCKETS
153
154#ifdef USE_SOCKET_IMPL_BSD_SOCKETS
155
156#include <cstdint>
157#include <fcntl.h>
158#include <sys/ioctl.h>
159#include <sys/socket.h>
160#include <sys/types.h>
161#include <sys/uio.h>
162#include <unistd.h>
163
164#ifdef USE_HOST
165#include <arpa/inet.h>
166#include <netinet/in.h>
167#include <netinet/ip.h>
168#include <netinet/tcp.h>
169#endif // USE_HOST
170
171#ifdef USE_ARDUINO
172// arduino-esp32 declares a global var called INADDR_NONE which is replaced
173// by the define
174#ifdef INADDR_NONE
175#undef INADDR_NONE
176#endif
177// not defined for ESP32
178using socklen_t = uint32_t;
179
180#define ESPHOME_INADDR_ANY ((uint32_t) 0x00000000UL)
181#define ESPHOME_INADDR_NONE ((uint32_t) 0xFFFFFFFFUL)
182#else // !USE_ESP32
183#define ESPHOME_INADDR_ANY INADDR_ANY
184#define ESPHOME_INADDR_NONE INADDR_NONE
185#endif
186
187#endif // USE_SOCKET_IMPL_BSD_SOCKETS
188
189#if defined(USE_SOCKET_IMPL_LWIP_TCP) || defined(USE_SOCKET_IMPL_LWIP_SOCKETS) || defined(USE_SOCKET_IMPL_BSD_SOCKETS)
190
191namespace esphome::socket {
192
193// Maximum length for formatted socket address string (IP address without port)
194// IPv4: "255.255.255.255" = 15 chars + null = 16
195// IPv6: full address = 45 chars + null = 46
196#if USE_NETWORK_IPV6
197static constexpr size_t SOCKADDR_STR_LEN = 46; // INET6_ADDRSTRLEN
198#else
199static constexpr size_t SOCKADDR_STR_LEN = 16; // INET_ADDRSTRLEN
200#endif
201
202} // namespace esphome::socket
203
204#endif
uint16_t in_port_t
Definition headers.h:60
uint32_t socklen_t
Definition headers.h:99
uint8_t sa_family_t
Definition headers.h:59
static void uint32_t
void * iov_base
Definition headers.h:103
size_t iov_len
Definition headers.h:104
uint8_t sin6_len
Definition headers.h:75
in_port_t sin6_port
Definition headers.h:77
struct in6_addr sin6_addr
Definition headers.h:79
uint32_t sin6_flowinfo
Definition headers.h:78
uint32_t sin6_scope_id
Definition headers.h:80
sa_family_t sin6_family
Definition headers.h:76
struct in_addr sin_addr
Definition headers.h:67
uint8_t sin_len
Definition headers.h:64
char sin_zero[SIN_ZERO_LEN]
Definition headers.h:69
sa_family_t sin_family
Definition headers.h:65
in_port_t sin_port
Definition headers.h:66
sa_family_t ss_family
Definition headers.h:94
uint32_t s2_data3[3]
Definition headers.h:97
char s2_data1[2]
Definition headers.h:95
uint32_t s2_data2[3]
Definition headers.h:96
uint8_t s2_len
Definition headers.h:93
uint8_t sa_len
Definition headers.h:86
sa_family_t sa_family
Definition headers.h:87
char sa_data[14]
Definition headers.h:88