4#ifdef USE_SOCKET_IMPL_LWIP_TCP
15#include "lwip/netif.h"
70 void init(
struct pbuf *initial_rx =
nullptr,
bool initial_rx_closed =
false);
78 return this->
accept(addr, addrlen);
107 if (this->
pcb_ ==
nullptr) {
117 err_t
recv_fn(
struct pbuf *pb, err_t err);
119 static void s_err_fn(
void *arg, err_t err);
120 static err_t
s_recv_fn(
void *arg,
struct tcp_pcb *pcb,
struct pbuf *pb, err_t err);
149 bool ready()
const {
return this->accepted_socket_count_ > 0; }
153 return this->
accept(addr, addrlen);
185 static void s_err_fn(
void *arg, err_t err);
188 err_t accept_fn_(
struct tcp_pcb *newpcb, err_t err);
189 static err_t s_accept_fn(
void *arg,
struct tcp_pcb *newpcb, err_t err);
192 static void s_queued_err_fn(
void *arg, err_t err);
193 static err_t s_queued_recv_fn(
void *arg,
struct tcp_pcb *pcb,
struct pbuf *pb, err_t err);
200 struct tcp_pcb *pcb{
nullptr};
201 struct pbuf *rx_buf{
nullptr};
202 bool rx_closed{
false};
210 static constexpr size_t MAX_ACCEPTED_SOCKETS = 2;
211 std::array<QueuedPcb, MAX_ACCEPTED_SOCKETS> accepted_pcbs_{};
212 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)
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)
ssize_t recvfrom(void *, size_t, sockaddr *, socklen_t *)
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)
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)