1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-29 08:32:26 +01:00

Fix API socket issues (#2288)

* Fix API socket issues

* Fix compile error against beta

* Format
This commit is contained in:
Otto Winter
2021-09-13 18:52:53 +02:00
committed by GitHub
parent 40c474cd83
commit ed7983af41
6 changed files with 142 additions and 77 deletions

View File

@@ -109,14 +109,17 @@ class LWIPRawImpl : public Socket {
LWIP_LOG("tcp_bind(%p ip=%u port=%u)", pcb_, ip.addr, port);
err_t err = tcp_bind(pcb_, &ip, port);
if (err == ERR_USE) {
LWIP_LOG(" -> err ERR_USE");
errno = EADDRINUSE;
return -1;
}
if (err == ERR_VAL) {
LWIP_LOG(" -> err ERR_VAL");
errno = EINVAL;
return -1;
}
if (err != ERR_OK) {
LWIP_LOG(" -> err %d", err);
errno = EIO;
return -1;
}
@@ -124,12 +127,13 @@ class LWIPRawImpl : public Socket {
}
int close() override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
LWIP_LOG("tcp_close(%p)", pcb_);
err_t err = tcp_close(pcb_);
if (err != ERR_OK) {
LWIP_LOG(" -> err %d", err);
tcp_abort(pcb_);
pcb_ = nullptr;
errno = err == ERR_MEM ? ENOMEM : EIO;
@@ -140,7 +144,7 @@ class LWIPRawImpl : public Socket {
}
int shutdown(int how) override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
bool shut_rx = false, shut_tx = false;
@@ -157,6 +161,7 @@ class LWIPRawImpl : public Socket {
LWIP_LOG("tcp_shutdown(%p shut_rx=%d shut_tx=%d)", pcb_, shut_rx ? 1 : 0, shut_tx ? 1 : 0);
err_t err = tcp_shutdown(pcb_, shut_rx, shut_tx);
if (err != ERR_OK) {
LWIP_LOG(" -> err %d", err);
errno = err == ERR_MEM ? ENOMEM : EIO;
return -1;
}
@@ -165,7 +170,7 @@ class LWIPRawImpl : public Socket {
int getpeername(struct sockaddr *name, socklen_t *addrlen) override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
if (name == nullptr || addrlen == nullptr) {
@@ -185,7 +190,7 @@ class LWIPRawImpl : public Socket {
}
std::string getpeername() override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return "";
}
char buffer[24];
@@ -196,7 +201,7 @@ class LWIPRawImpl : public Socket {
}
int getsockname(struct sockaddr *name, socklen_t *addrlen) override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
if (name == nullptr || addrlen == nullptr) {
@@ -216,7 +221,7 @@ class LWIPRawImpl : public Socket {
}
std::string getsockname() override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return "";
}
char buffer[24];
@@ -227,7 +232,7 @@ class LWIPRawImpl : public Socket {
}
int getsockopt(int level, int optname, void *optval, socklen_t *optlen) override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
if (optlen == nullptr || optval == nullptr) {
@@ -261,7 +266,7 @@ class LWIPRawImpl : public Socket {
}
int setsockopt(int level, int optname, const void *optval, socklen_t optlen) override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
if (level == SOL_SOCKET && optname == SO_REUSEADDR) {
@@ -314,7 +319,7 @@ class LWIPRawImpl : public Socket {
}
ssize_t read(void *buf, size_t len) override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
if (rx_closed_ && rx_buf_ == nullptr) {
@@ -368,7 +373,7 @@ class LWIPRawImpl : public Socket {
}
ssize_t write(const void *buf, size_t len) override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
if (len == 0)
@@ -386,24 +391,37 @@ class LWIPRawImpl : public Socket {
LWIP_LOG("tcp_write(%p buf=%p %u)", pcb_, buf, to_send);
err_t err = tcp_write(pcb_, buf, to_send, TCP_WRITE_FLAG_COPY);
if (err == ERR_MEM) {
LWIP_LOG(" -> err ERR_MEM");
errno = EWOULDBLOCK;
return -1;
}
if (err != ERR_OK) {
errno = EIO;
LWIP_LOG(" -> err %d", err);
errno = ECONNRESET;
return -1;
}
LWIP_LOG("tcp_output(%p)", pcb_);
err = tcp_output(pcb_);
if (err != ERR_OK) {
errno = EIO;
return -1;
if (tcp_nagle_disabled(pcb_)) {
LWIP_LOG("tcp_output(%p)", pcb_);
err = tcp_output(pcb_);
if (err == ERR_ABRT) {
LWIP_LOG(" -> err ERR_ABRT");
// sometimes lwip returns ERR_ABRT for no apparent reason
// the connection works fine afterwards, and back with ESPAsyncTCP we
// indirectly also ignored this error
// FIXME: figure out where this is returned and what it means in this context
return to_send;
}
if (err != ERR_OK) {
LWIP_LOG(" -> err %d", err);
errno = ECONNRESET;
return -1;
}
}
return to_send;
}
int setblocking(bool blocking) override {
if (pcb_ == nullptr) {
errno = EBADF;
errno = ECONNRESET;
return -1;
}
if (blocking) {
@@ -466,7 +484,7 @@ class LWIPRawImpl : public Socket {
static void s_err_fn(void *arg, err_t err) {
LWIPRawImpl *arg_this = reinterpret_cast<LWIPRawImpl *>(arg);
return arg_this->err_fn(err);
arg_this->err_fn(err);
}
static err_t s_recv_fn(void *arg, struct tcp_pcb *pcb, struct pbuf *pb, err_t err) {