4#ifdef USE_SOCKET_IMPL_LWIP_TCP
15#include "lwip/netif.h"
67 static_assert(EINPROGRESS < 256 && EISCONN < 256 && ECONNREFUSED < 256 && ECONNRESET < 256 && ETIMEDOUT < 256,
68 "connect_err_ stores errno values in a byte");
71static_assert(
sizeof(
LWIPRawCommon) ==
sizeof(
struct tcp_pcb *) + 4,
"LWIPRawCommon grew past one word of flags");
80 void init(
struct pbuf *initial_rx =
nullptr,
bool initial_rx_closed =
false);
88 return this->
accept(addr, addrlen);
125 if (this->
pcb_ ==
nullptr) {
135 err_t
recv_fn(
struct pbuf *pb, err_t err);
137 static void s_err_fn(
void *arg, err_t err);
138 static err_t
s_recv_fn(
void *arg,
struct tcp_pcb *pcb,
struct pbuf *pb, err_t err);
139 static err_t
s_connected_fn(
void *arg,
struct tcp_pcb *pcb, err_t err);
159 "LWIPRawImpl layout changed");
171 bool ready()
const {
return this->accepted_socket_count_ > 0; }
175 return this->
accept(addr, addrlen);
207 static void s_err_fn(
void *arg, err_t err);
210 err_t accept_fn_(
struct tcp_pcb *newpcb, err_t err);
211 static err_t s_accept_fn(
void *arg,
struct tcp_pcb *newpcb, err_t err);
214 static void s_queued_err_fn(
void *arg, err_t err);
215 static err_t s_queued_recv_fn(
void *arg,
struct tcp_pcb *pcb,
struct pbuf *pb, err_t err);
222 struct tcp_pcb *pcb{
nullptr};
223 struct pbuf *rx_buf{
nullptr};
224 bool rx_closed{
false};
232 static constexpr size_t MAX_ACCEPTED_SOCKETS = 2;
233 std::array<QueuedPcb, MAX_ACCEPTED_SOCKETS> accepted_pcbs_{};
234 uint8_t accepted_socket_count_ = 0;
Non-virtual common base for LWIP raw TCP sockets.
int getsockname(struct sockaddr *name, 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 bind(const struct sockaddr *name, socklen_t addrlen)
LWIPRawCommon(const LWIPRawCommon &)=delete
LWIPRawCommon & operator=(const LWIPRawCommon &)=delete
int ip2sockaddr_(ip_addr_t *ip, uint16_t port, struct sockaddr *name, socklen_t *addrlen)
int setsockopt(int level, int optname, const void *optval, socklen_t optlen)
int getsockopt(int level, int optname, void *optval, socklen_t *optlen)
bool sockaddr2ip_(const struct sockaddr *name, socklen_t addrlen, ip_addr_t *ip, uint16_t *port, bool for_bind) const
sockaddr of this socket's family to lwip address and port; false with errno on mismatch.
int getpeername(struct sockaddr *name, socklen_t *addrlen)
LWIPRawCommon(sa_family_t family, struct tcp_pcb *pcb)
size_t getpeername_to(std::span< char, SOCKADDR_STR_LEN > buf)
Format peer address into a fixed-size buffer (no heap allocation)
Connected socket implementation for LWIP raw TCP.
ssize_t read_locked_(void *buf, size_t len)
ConnectPollResult poll_connect(int &err_out) const
ssize_t recvfrom(void *, size_t, sockaddr *, socklen_t *)
int connect(const struct sockaddr *addr, socklen_t addrlen)
Non-blocking: returns -1/EINPROGRESS once the SYN is queued, see poll_connect().
static err_t s_recv_fn(void *arg, struct tcp_pcb *pcb, struct pbuf *pb, err_t err)
void init(struct pbuf *initial_rx=nullptr, bool initial_rx_closed=false)
std::unique_ptr< LWIPRawImpl > accept(struct sockaddr *, socklen_t *)
bool waiting_for_data_() const
ssize_t readv(const struct iovec *iov, int iovcnt)
int setblocking(bool blocking)
static void s_err_fn(void *arg, err_t err)
ssize_t sendto(const void *, size_t, int, const struct sockaddr *, socklen_t)
std::unique_ptr< LWIPRawImpl > accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen)
err_t recv_fn(struct pbuf *pb, err_t err)
ssize_t internal_write_(const void *buf, size_t len)
ssize_t write(const void *buf, size_t len)
ssize_t read(void *buf, size_t len)
static err_t s_connected_fn(void *arg, struct tcp_pcb *pcb, err_t err)
ssize_t writev(const struct iovec *iov, int iovcnt)
Listening socket implementation for LWIP raw TCP.
ssize_t recvfrom(void *, size_t, sockaddr *, socklen_t *)
static void s_err_fn(void *arg, err_t err)
std::unique_ptr< LWIPRawImpl > accept_loop_monitored(struct sockaddr *addr, socklen_t *addrlen)
ssize_t writev(const struct iovec *, int)
ssize_t read(void *, size_t)
std::unique_ptr< LWIPRawImpl > accept(struct sockaddr *addr, socklen_t *addrlen)
ssize_t sendto(const void *, size_t, int, const struct sockaddr *, socklen_t)
ssize_t readv(const struct iovec *, int)
ssize_t write(const void *, size_t)
ConnectPollResult
Outcome of polling a non-blocking connect(); see socket::poll_connect().